一.EXPLAIN查看SQL执行计划
EXPLAIN语句解析
expain解析出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra
1.id
SELECT语句的标识符,一般为数字,表示对应的SELECT语句在原始语句中的位置。没有子查询或联合的整个查询只有一个SELECT语句,因此其id通常为1。在联合或子查询语句中,内层的SELECT语句通常按它们在原始语句中的次序进行编号。但UNION操作通常最后会有一个id为NULL的行,因为UNION的结果通常保存至临时表中,而MySQL需要到此临时表中取得结果。
1.1id 相同执行顺序由上到下,即下面sql表的执行顺序是t3,t1,t2.
1.2如果是子查询,id序号会自增,id值越大优先级就越高,越先被执行。
1.3id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
2.select_type 数据读取操作的操作类型
3.table 输出行所引用的表
4.type访问类型 由好到差system > const > eq_ref > ref > range > index > ALL
链接类型 | 说明 |
system | 表只有一行,MyISAM引擎。 |
const | 表中至多有一个匹配的行,该行仅在查询开始时读取一次,因此,该行此字段中的值可以被优化器看作是个常量(constant);当基于PRIMARY KEY或UNIQUE NOT NULL字段查询,且与某常量进行等值比较时其类型就为const,其执行速度非常快; |
eq_ref |
类似于const,表中至多有一个匹配的行,但比较的数值不是某常量,而是来自于其它表;ed_ref出现在PRIMARY KEY或UNIQUE NOT NULL类型的索引完全用于联结操作中进行等值(=)比较时; |
fulltext | 用于FULLTEXT索引中用纯文本匹配的方法来检索记录。 |
ref_or_null | 与ref类似,但包括NULL |
index_merge |
使用“索引合并优化”的记录访问类型,相应地,其key字段(EXPLAIN的输出结果)中会出现用到的多个索引,key_len字段中会出现被使用索引的最长长度列表;将多个“范围扫描(range scan)”获取到的行进行合并成一个结果集的操作即索引合并(index merge)。 |
unique_subquery | 在in子查询中,就是value in (select…)把形如select unique_key_column的子查询替换。PS:所以不一定in子句中使用子查询就是低效的! |
index_subquery | 类似于unique_subquery,但子查询中键值不惟一; |
range |
带有范围限制的索引扫描,而非全索引扫描,它开始于索引里的某一点,返回匹配那个值的范围的行;相应地,其key字段(EXPLAIN的输出结果)中会输出所用到的索引, |
index |
索引树扫描。a.当查询是索引覆盖的,即所有数据均可从索引树获取的时候(Extra中有Using Index);b.以索引顺序从索引中查找数据行的全表扫描(无 Using Index);c.如果Extra中Using Index与Using Where同时出现的话,则是利用索引查找键值的意思;d.如单独出现,则是用读索引来代替读行,但不用于查找 |
all | 全表扫描(full table scan) |
5.Extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
原文:https://www.cnblogs.com/konglxblog/p/14753499.html