暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL tips(二十四)——执行计划

爱可可的人生记录仪 2020-04-03
718
不管是sql优化,还是索引优化,分析语句的执行计划都是必不可少的步骤,简单整理一下部分知识点。


执行计划

desc/explain 语句

截取优化器选择的执行计划,用来分析判断语句的执行效率

查询类型 type 

全表扫描:ALL

索引扫描:index,range,ref,eq_ref,const(system),NULL

index:全索引扫描(遍历索引树)

range:索引范围扫描(> < between and, or in like)

大于小于的效率大于or,in

or、in可以用union all代替

ref:辅助索引等值查询

eq_ref:多表连接时,子表使用主键或唯一键作为连接条件(驱动表肯定全表扫描)

const(system):主键或者唯一键的等值查询

NULL:不在数据库中


key_len 索引覆盖长度(用于分析联合索引)

按照数据类型的最大预留长度计算,null会占用一个字节

charset utf8mb4,每个字符的最大预留长度是4个字节

int(11) 4+1=5

char(2) 4*2+1=9

varchar(2) 4*2+1+2=11

对于联合索引,用几个索引列就把这几列长度相加。

唯一值多的列放在最左侧,如果都是等值,则无关顺序,如果不连续的话,会卡住。如果出现不等值查询,就会卡在不等值处。如果多子句查询,可以应用联合索引。


索引应用规范

1.必须要有主键,无关列,自增长

2.经常作为where,order by,group by,join on的条件

3.最好使用唯一值多的作为联合索引前导列

4.列值较长的索引列,建议使用前缀索引

5.不要创建没用索引,不常使用的要清理(pt-duplicate-key-checker、pt-index-usage)

6.索引维护避开业务繁忙期

7.小表不要创建索引

不走索引的情况

1.没有查询条件,查询条件没索引

2.查询结果集是大部分数据>25%以上,有可能

3.索引本身失效,统计数据不真实

4.对索引列进行函数,运算等操作

5.隐式转换导致的索引失败,注意引号

6.对于辅助索引,!=,not in,<>不走索引的,但主键是走索引的

7.like模糊匹配%在前不走

8.联合索引细节


题外话:我们部门的技术总监跑路了。。。很烦,最近也开始准备面试了。有的时候想想,也许这就是人生吧,与君共勉。

参考资料:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html


部分内容来自网络,如有侵权请联系作者删除。



文章转载自爱可可的人生记录仪,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论