explain的介绍
使用explain关键字可以模拟SQL优化器执行SQL查询语句,
功能:让程序员了解MySQL是如何处理传入的SQL语句的,分析SQL语句或是表结构是否存在性能瓶颈
使用方式: explain + SQL语句
结果字段:(MySQL 8.0版本各字段)
字段解释:
- id:分为三种情况:
id相同:加载表顺序为从上到下
id不同:id值越大,优先级越高,越先被执行。
id也有相同也有不同:id相同的为一组,从上到下顺序执行;在所有的组中,id值越大,优先级越高,越先被执行。 - select_type:查询语句的类型
simple:简单查询
primary:查询中若包含子查询,最外层查询被标记为primary
subquery:子查询
derived:临时表(衍生),在from列表中包含的子查询被标记
union:union之后的查询语句被标记 - table:查询的表名
- partitions:
- type*:访问类型
从最好到最坏其次为(*表示重点掌握)
system *> const *> eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range(尽量保证) > index > ALL *
system 表示表只有一行记录
const 表示通过索引一次就找到了
eq_ref 表示唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。
ref 表示非唯一性索引扫描,返回匹配某个单独值的所有行。
range 表示只检索给定范围的行,即只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。
index 表示遍历索引树 all 表示遍历全表,区别在于index从索引中读取,而all是从硬盘上读取。 - possible_keys:显示可能会用到的索引,一个或多个,但实际上不一定会用到
- key:实际上用到的索引
- key_len:索引中使用到的字节数,即索引的长度
- ref:哪些列或常量被用于查找索引列上的值
- rows:执行查询时必须检查的行数,越少越好
- filtered:按照条件过滤行占比
- Extra:包含不适合在其他列中显示但十分重要的额外信息,例如:
- Using filesort,说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”,需要优化
- Using temporary,在对查询结果排序时使用临时表,需要优化
- USING index,表示相应的select操作中使用了覆盖索引,避免访问了表的数据行,效率不错!