Skip to content

MySQL 解释下 explain 显示的每个字断

cxuan edited this page Sep 20, 2020 · 1 revision

explain 显示的字段 分别为 id、select_type、table、partitions、type、possible_keys、key、key_len、ref、rows、filtered、Extra 一共12个字段。

一.id 表示执行的select 子句的顺序,id值越大,表示优先级越高,执行顺序越靠前, 如果id相同,那么就从上到下顺序执行。比如说sql里面有嵌套语句,最里面的sql id越大。

二。select_type 表示查询的类型,用来表示查询的复杂度 比如说 普通查询、联合查询、子查询 。 其值 有 1.SIMPLE 不包含任何子查询或者union的最简单查询。 2.PRIMARY 嵌套查询的最外层查询语句 3.SUBQUERY 说明是包含有子查询的语句 4.DERIVED select * from ( xxxx) , 里面的这个xxxx 的类型就是DERIVED 5.UNION 语句后面有 union

三.table 查询的表名,也可以是虚拟表 比如说表的别名

四.partitions 查询分区表的时候显示分区命中的情况。 非分区表用不上

五.type 重点中的重点,表示使用了什么类型的查询,是sql优化中重点观测指标。 效率为system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL。

system 表示表里面只有一行 const表示命中主键或者唯一索引 或者连接的部分是一个常量 比如说 select *from where id=1 eq_ref 在表关联的字段是主键或者唯一索引 ref 关联的字段为非唯一索引 ref_or_null 关联的字段为非唯一索引,且会扫描包含null的字段 index_merge 使用了索引合并优化 同时用到了两个索引 range 有索引,但是是范围查询 index 按索引树扫描全表 ALL 无索引 扫描全表

六:possible_keys 可能使用的索引,但是不一定真的会被使用

七 : key 真实使用的索引

八:key_len 索引长度

九 :ref 关联字段 1.常量等值查询,显示const 2.关联查询时,会显示相应关联表的关联字段 3.查询条件使用了表达式、函数,或者条件列发生内部隐式转换,可能显示为func 4.非以上情况显示null

十:rows 读取的数据行数,通过采样统计得出,并非真实的扫描行数 ,innodb默认取N个数据页,统计这个页面上的不同的值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。通过命令analyze table 表名 可以刷新这个值。

十一:filtered 表里符合查询条件的记录数的百分比

十二:Extra 拓展信息,值如下 1、Using index 使用了覆盖索引,sql优化中的最理想情况 2、Using where 没用到索引,扫了全表,是用的where条件过滤数据 3、Using temporary 表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到 4、Using filesort 表示无法利用索引完成的排序操作,也就是ORDER BY的字段没有索引,通常这样的SQL都是需要优化 5、Using join buffer:在我们联表查询的时候,如果表的连接条件没有用到索引,需要有一个连接缓冲区来存储中间结果 6、Impossible where 没用符合where条件的数据

Clone this wiki locally