最近决定将以前同事写的存储过程查看一遍,寻找一些代码上写的不太好的地方,争取进行修改以后让这些过程达到一个很好的运行速度。下面是遇到的最多的几个问题。

我遇到了这样的一个SQL:

select name, count(*) from (select name from table_1) a group by a.name;

MySQL的执行计划对于这种派生表的解释非常的不友好,但是能直观的感觉到的是,这个SQL执行速度特别的慢。查看这个表table_1发现,name字段是有索引的。审视这段代码,可以推断出当时程序员的想法,应该是想让数据库扫描更小的结果集,因为select *是很不好的习惯。不过他应该忽略了一个MySQL的很重要的特点就是索引。MySQL的索引是个很有意思的东西,是我从Oracle转过来感觉最好玩的东西,好玩的地方就在于,可以优化group by。当我把这个SQL改成如下SQL以后:

select name, count(*) from table_1 group by name;

这样一来,这段SQL的执行速度就非常的快了,extra列明确的显示了using index,索引覆盖查询,速度杠杠的。

其实这种错误应该是程序员常犯的,因为程序员对Java等代码超级熟悉,但是对于SQL,基本上都是大学的时候学习的SQL,用SQLServer练出来的,基本上没有对数据库进行非常深入的研究,其实每种数据库中,同一条SQL的执行计划都是不尽相同的,这也就是企业有一个专业的DBA的一个作用。

下面,就是一个让人很头疼的错误:

select name, userid from table_1 where name = null;

不管是MySQL还是Oracle,对这种SQL的写法的规范都是where name is (not) null。null这个值,在不管什么数据库里都是一个让人(包括程序员和DBA)都很头疼的东西。我对MySQL的理解还不够深入,但是根据某一本《Oracle DBA手记》中记载,Oracle中每种数据类型的null都代表了不一样的意义。

做了下面一个实验:

可以看出来,不管是“= null”还是“<> null”,得到的值其实都是不确定,也就是null。因此,必须要写成is (not) null。在《剑破冰山》这本书里也有对Oracle的null值的详细介绍。

总结一下最近的工作,我研究了小半年时间的MySQL,发现这个开源的数据库并不像我过去认为的那样,就是一个互联网数据库。这个数据库在面向OLAP复杂计算的方面确实和Oracle,DB2等商用数据库之间有不小的差距,不过在MariaDB这个分支中,这部分有了不小的进步,相信后面的MySQL版本中也会越来越好。其实这个数据库最让我感兴趣的不是开源,因为我确实看不懂那么长的源代码,我的C语言水平就是大学毕业水平。这个数据库最让我感兴趣(起码现在来讲)是它的索引,它的索引和Oracle有很大的不同,尤其是InnoDB的表整个就是用索引组织起来的,在简单的查询的时候,一个索引覆盖查询就可以无敌于天下了,在group by和order by的时候,如果是索引字段,效率会相当的高。

其实我还想说的就是,一个团队里,如果涉及到大量存储过程的编写,一定要有一个专业的DBA人员参与其中。SQL是一个标准,横跨了所有的关系型数据库,但是每一种关系型数据库对SQL的实现又不尽相同,因此同样的一段SQL,放到不同的数据库上执行,效率上就会千差万别。而SQL又非常容易用人最习惯最简单的思维写出来,比如搜索一个订单表里美国员工生成的订单信息,SQL有可能是这样的:

select * from orders t1where t1.employee_id in (select employee_id from employee t2 where t2.nation = 'USA');

如果是Oracle这样的商业数据库,这个SQL的执行效率可能会比较好,但是应该不如用exists的SQL。但是当这段SQL在MySQL中执行的时候,效率就很差了,因为很多人都知道,MySQL的子查询效率实在是不敢恭维。这段代码会被改为相关子查询,而且随着数据量的增长,执行时间会越来越长。这段代码如果改成下面的SQL,效果会更好:

select t1.*from orders t1
inner join employee t2on t1.employee_id = t2.employee_id
where t2.nation = 'USA';

如果表上有索引,执行速度快极了。

写SQL,还是要首先研究这个数据库的原理,然后慎而又慎的写。

转载于:https://www.cnblogs.com/fuhaots2009/p/3481736.html

从最近MySQL的优化工作想到的相关推荐

  1. mysql union查询_一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  2. 一本彻底搞懂MySQL索引优化EXPLAIN百科全书

    MySQL逻辑架构介绍 日常在CURD的过程中,都避免不了跟数据库打交道,大多数业务都离不开数据库表的设计和SQL的编写,那如何让你编写的SQL语句性能更优呢? 先来整体看下MySQL逻辑架构图: M ...

  3. MySQL索引优化分析

    转载来源:https://www.cnblogs.com/itdragon/p/8146439.html MySQL索引优化分析 为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学 ...

  4. MySQL性能优化的参数简介

    公司网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可 ...

  5. MySQL性能优化的最佳20+条经验

    转自:MySQL性能优化的最佳20+条经验 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注 ...

  6. 菜鸟的mysql高级进阶以及mysql数据库优化

    菜鸟的mysql高级进阶以及mysql数据库优化 说明 一.mysql的逻辑分层及存储引擎 (1)逻辑分层 (2)存储引擎 二.事务的ACID原则 三.数据库设计的三大范式 四.索引 (1)二叉树搜索 ...

  7. 【学习】016 MySQL数据库优化

    MySQL如何优化 表的设计合理化(符合3NF) 添加适当索引(index) [四种: 普通索引.主键索引.唯一索引unique.全文索引] SQL语句优化 分表技术(水平分割.垂直分割) 读写[写: ...

  8. mysql语句优化难点大全_mysql优化建议大全

    1.选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置NOT NULL,例如'省份,性别',最好设置为ENUM 2.使用连接(JOIN)来代替子查询: a.删除没有任何订单客户:DELETE ...

  9. mysql语句生成工具_强烈推荐一款MySQL语句优化辅助工具,值得收藏

    概述 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.对于一名DBA来说,掌握一门语言配合自己的工作是非常必要的.相对于shell的简单.perl的 ...

最新文章

  1. 普华永道:人工智能将重塑职位格局并与物联网合并
  2. android app系统的测试_计算机毕设项目003之基于Android系统的App点餐外送系统
  3. python语言能干什么-python语言能做什么
  4. 最长公共子序列LCS[C++题解]
  5. 青少年蓝桥杯_2020_steam考试_中级组_第一题
  6. java中如何改变状态栏_如何创建状态栏
  7. webRTC+coturn穿透服务器的安装与搭建
  8. Using .NET C# LDAP Library(Novell.Directory.Ldap)
  9. 沟通技巧系列 - 积极和移情倾听
  10. python批量获取图像路径txt
  11. paip.windows io监控总结
  12. codewars python Regex validate PIN code
  13. 傅里叶分析斯坦恩中文版pdf_傅里叶分析
  14. uniapp简单的登录页面布局
  15. 五阶魔方公式java_5阶魔方教程(五阶魔方一步一步图解)
  16. 【通过】华为OD机试真题59:叠积木
  17. 【海康威视】前端开发:【5】PaleMoon苍月浏览器 Web Components Kit 插件支持
  18. c-lightning 闪电网络配置洋葱服务(tor)
  19. 拓嘉恒业:拼多多新品如何推广
  20. 奢侈品典当价格以及流程又是如何的?现今哪些品牌的奢侈品押呗可以典当!

热门文章

  1. 查杀计算机病毒吗,查杀电脑病毒电脑中病毒,但用杀毒软件却怎么也查不出来.这是为什么 爱问知识人...
  2. 贾跃亭被要求6天内回国 若逾期未归会怎样?
  3. web前端:main、header、footer、nav、article、section标签的用法
  4. 第30天-WEB 漏洞-RCE 代码及命令执行漏洞全解
  5. 360 N6 Pro发布现场,周鸿祎为这款1699元的全面屏手机站台
  6. 一种简单的蒙特卡洛树搜索并行化方法
  7. python数据挖掘系列(一)
  8. 《FORTRAN语法:章节篇》第0章 Fortran基础知识
  9. 著作权的内容 | Charmi‘s legal expression
  10. 英语购物计算机,关于互联网购物英语作文