一、执行计划有什么用?
二、主要指标:
1. select_type
• SIMPLE:简单的查询(没有union或子查询)
• PRIMARY:最外层的查询(有union或子查询)
• DERIVED:衍生表查询(FROM语句中的子查询)
2. type
• 从优到差排序如下:
const:只匹配一行,根据主键或唯一键进行查询
eq_ref:单行关联查询,根据主键或唯一键进行join
ref:索引键值查询,根据普通索引进行查询或join
range:索引范围查询
index:索引扫描查询
all:全表扫描查询
3. possible_keys
优化器可能用到的索引
4. key
实际用到的索引,没有则为null
5. rows
预估检查行数
三、执行计划的原则
• 查询类型保持为SIMPLE
• 避免index和all
• 确保用到索引,key不能为NULL • 检查行数rows越少越好
• 禁止temporary(MySQL需要进行额外的排序来获取数据)和filesort(MySQL需要创建临时表来存放数据)
四、MySQL性能规范:
规范1
禁止 Select *
禁止 Or,使用Union(All)
禁止 Select for update(用乐观锁)
禁止 Delete(特别是全量delete),用Update做 软删除
禁止关联子查询
禁止条件字段函数,与隐式类型转换
规范2
• 一切Batch化:
limit M, N,不超过100ms
Batch insert :1000~5000行一个批次,操 作时间<1s
IN(id1,id2 , ... , idn):列表控制在100~ 500,响应时间<100ms
规范3
• 禁止执行计划中的Filesort: – 合理的索引
Order by NULL避免多余排序
使用Join/Group by/Distinct,必须参考 filesort原则