4)隐式类型转换造成不使用索引
Select col1 from table where key_varchar=123;
上述语句由于索引对列类型为varchar,但给定的值为数值,涉及隐式类型转换,造成不能正确走索引 。
5)避免对索引字段进行计算
避免对索引字段进行任何计算操作,对索引字段的计划操作会让索引的作用失效,令数据库选择其他的较为低效率的访问路径 。
6)避免对索引字段进行是否值判断
避免使用索引列值是否可为空的索引,如果索引列值可以是空值,在SQL语句中那些要返回值的操作,将不会用到索引 。
7)避免对索引字段不等于符号
使用索引列作为条件进行查询时,需要避免使用<>或者!=等判断条件 。如确实业务需要,使用到不等于符号,需要在重新评估索引建立,避免在此字段上建立索引,改由查询条件中其他索引字段代替 。
18、避免重复查询更新的数据
针对业务中经常出现的更新行同时又希望获得改行信息的需求,MySQL并不支持PostgreSQL那样的UPDATE RETURNING语法,在MySQL中可以通过变量实现 。
例如,更新一行记录的时间戳,同时希望查询当前记录中存放的时间戳是什么,简单方法实现:
Update t1 set time=now where col1=1;
Select time from t1 where id =1;
使用变量,可以重写为以下方式:
Update t1 set time=now where col1=1 and @now: = now ;
Select @now;
前后二者都需要两次网络来回,但使用变量避免了再次访问数据表,特别是当t1表数据量较大时,后者比前者快很多 。
19、避免出现不确定结果的函数
特定针对主从复制这类业务场景 。由于原理上从库复制的是主库执行的语句,使用如now、rand、sysdate、current_user等不确定结果的函数很容易导致主库与从库相应的数据不一致 。另外不确定值的函数,产生的SQL语句无法利用QUERY CACHE 。
使用EXPLAIN分析SQL性能
1、执行计划
执行计划是一条查询语句在数据库中的执行过程或访问路径的描述 。
2、怎样查看MySQL执行计划
在需要查看执行计划的SQL前面添加explain并执行,即可获取 。

文章插图
3、读EXPLAIN中的信息
1)table
显示这一行的数据是关于哪张表的 。
2)type
这是重要的列,显示连接使用了何种类型 。
从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL 。
3)possible_keys
显示可能应用在这张表中的索引 。如果为空,没有可能的索引 。
4)key
实际使用的索引 。如果为,则没有使用索引 。很少的情况下,MYSQL会选择优化不足的索引 。
5)key_len
使用的索引的长度 。在不损失精确性的情况下,长度越短越好 。
6)ref
显示索引的哪一列被使用了,如果可能的话,是一个常数 。
7)rows
MYSQL认为必须检查的用来返回请求数据的行数 。
8)Extra
关于MYSQL如何解析查询的额外信息 。效率最低的是Using temporary和Using filesort,意味着MYSQL根本不能使用索引,所以检索会很慢 。
4、使用EXPLAIN中分析SQL性能
例1:

文章插图
看左边sql语句的执行计划,看得出没有走任何索引,属于全表扫描,导致执行时间比较长 。通过给业务表添加适当的索引,这条语句的执行时间由9秒变为60毫秒,扫描行数由257910行变成1行,效率提升明显 。
例2:

文章插图
原语句执行的时候是全表扫面,分页查询效率低,改为利用主键来获取后,执行时间由33秒变为1.2秒,效率提升明显 。
慢日志查询管理平台
为了提高SQL分析和优化的效率,我们开始利用自动化的方式来实现慢SQL的获取和智能分析,平台页面如下:

文章插图
这个是我们现在在做的,慢日志查询和智能分析平台,可以很方便的获取慢查询语句,并通过预先设置的优化规则,自动得到一些优化建议 。

文章插图
上述功能并不是完全是自主开发的,而是借助了开源工具yearningSQL并做了一些扩展,也就是加入我们自定义的一些规则 。然后,平台对要执行的SQL做分析 。通过触碰事先定义好的规则来判断这个SQL是否可以通过审核,无法通过自动审核的SQL再由人工来处理 。
推荐阅读
- 详解Mysql数据库不同字符集下迁移方法
- Mysql数据库连接查询
- mysql 数据分析如何实现日报、周报、月报和年报?
- MySQL 触发器
- ThinkPHP 5.0添加mysql存session驱动
- Mysql 为什么要选择 B+Tree
- Mysql通讯协议分析
- 分享mysql配置文件my.cnf一键生成器
- Mysql中ACID的原理?
- 从淘宝MySQL数据库经典案例来看innodb如何设计主键索引
