MySQL的EXPLAIN分析结果含义

发布时间 2023-03-28 10:45:07作者: starmoon1900
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