MySQL的EXPLAIN分析结果含义
EXPLAIN字段
id
id相同执行顺序从上到下
id不同 id越大 优先级越高 越先被执行
select_type
查询的类型,主要用于区别普通查询,联合查询,子查询等的复杂查询。
SIMPLE:简单的select查询 查询中不包含子查询或者union
PRIMARY:查询中若包含复杂的子部分 最外层查询则被标记为PRIMARY 最后执行
DERIVER:在FROM列表中包含的子查询被标记为DERIVERD(派生)MYSQL递归执行子查询 结果防在临时表
SUBQUERY:在select或where中包含了子查询
UNION:若第二个select出现在union之后 则被标记为union 若union包含在from子句的子查询中 外层select将被标记为derived
TYPE
type表示这行查询的关联类型(访问类型,或查询类型),通过该值可以了解该行查询数据记录的大概范围。
常见的值依次从最优到最差分别为:system > const > eq_fef > ref > range > index > all;
一般优化至少要到range
ALL:all 是最坏的情况,因为采用了全表扫描的方式。index 和 all 差不多,只不过 index 对索引表进行全扫描,这样做的好处是不再需要对数据进行排序,但是开销依然很大。所以,要尽量避免全表扫描和全索引扫描。
INDEX:遍历索引树全表
RANGE:表示采用了索引范围扫描,一般在 where 子句中使用 < 、>、in、between 等关键词,只检索给定范围的行,属于范围查找。从这一级别开始,索引的作用会越来越明显,因此我们需要尽量让 SQL 查询可以使用到 range 这一级别及以上的 type 访问方式。
REF:表示采用了非唯一索引,或者是唯一索引的非唯一性前缀,返回数据返回可能是多条。因为虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在一个非常小的范围内扫描。
eq_ref:使用主键或唯一索引时产生的访问方式,通常使用在多表联查中。比如,对两张表进行联查,关联条件是两张表的 user_id 相等,且 user_id 是唯一索引,那么使用 EXPLAIN 进行执行计划查看的时候,type 就会显示 eq_ref。
SYSTEM/CONST:MySQL能对某个查询部分进行优化并将其转化成一个常量(可以通过 show warnings 查看优化的结果),主要是查询主键(primary key)或唯一索引(Unique Key)对应的记录,因为不存在重复,所以最多只能查询出一条记录,所以速度比较快。system 是 const的特例,当临时表只有一条记录时为system。
possible_keys
显示可能用到的索引 注意是可能 并不一定真的用上
key
实际使用的索引,若为null,则没有使用索引
当使用了覆盖索引时,key和select字段应该相同
key_len
表示索引中使用的字节数,通过该列计算查询中使用的索引的长度,在不损失精度的情况下,通常越少越好。
它显示的是最大可能长度,而并非一定就是实际使用长度。
即它是根据表定义计算得到而不是通过表内检索而得到的。
key_len字段能够帮你检查是否充分的利用上了索引。
rows
MYSQL认为执行查询时必须检查的行数
Extra
不适合在其他列中显示 但是很重要的信息
using filesort:明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取的。出现这个就说明问题很严重
using temporary:使用了临时表 常见于排序order by和分组group by 出现说明问题巨严重
using index:使用的覆盖索引
using where:使用了where
impossible where:where子句的值总是false 不能用来获取任何元组
————————————————
版权声明:本文为CSDN博主「南瓜的春天」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_56892136/article/details/125684820