执行计划
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
部分内容来自网络,如有侵权请联系作者删除。