一、执行计划中的常用字段
1. id:select 语句的序号,id 相同时按顺序执行,id 不同时,id 值越大的,优先级越高,越先执行
2. select_type:查询的类型,常见的有 SIMPLE、PRIMARY、SUBQUERY、UNION、DERIVED、UNION RESULT
3. table:查询用到的表
4. type:查询执行的类型
- 从性能最优到最差的排序:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
- const:表中最多只有一行匹配的记录,只需要一次查询,常见于主键和唯一索引
- range:索引范围查询
- index:遍历整棵索引树
- ALL:全表扫描,性能最差,要避免
5. key:查询时实际用到的索引
6. rows:估算的所需读取的记录或行数,越小越好
7. Extra:查询的额外信息
- Using index 表示使用了索引覆盖,不用回表效率高
- Using index condition:索引下推(先判断联合索引包含的字段是否符合条件,先不发给 MySQL 的 server 层,先在引擎层过滤不符合条件的记录
- Using where:使用了 Where 子句进行条件过滤,常见于没用到索引的场景
- Using filesort:排序时使用了外部的索引排序❓没有使用表内的索引❓有什么区别吗
- Using temporary:需要创建临时表来保存查询到的结果,常见于 order by 和 group by
二、如何优化查询效率
1. 通过 key 字段查看使用索引的情况,如果 key = null 表示没有使用索引,考虑增加索引或者使用已有索引来查询
2. 避免 select * 全表查询(type = ALL),使用索引覆盖优化(extra = Using index)
3. 尽可能使用简单的 Where 子句(select_type = SIMPLE),避免使用子查询(select_type = SUBQUERY)
4. 当 Extra 列包含 Using filesort 或 Using temporary 时,MySQL 的性能可能会存在问题,需要尽可能避免。