目录
作用
- 表的读取顺序
- 数据读取操作的操作类型
- 那些索引可以使用
- 哪些索引实际被使用
- 表之间的引用
- 每张表有多少行被优化器查询
表组成
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
---|
id(表的读取顺序)
为select查询的序列号,包含一组数字,表的加载顺序
- id相同,执行顺序为从上到下顺序执行。
- id不同,数字大的先执行
select_type(数据读取操作的操作类型)
查询类型,主要用于区别普通查询、联合查询、子查询等复杂查询。
字段
字段 | 含义 |
---|---|
SIMPLE | 简单的查询,不包含子查询或者UNION |
PRIMARY | 查询中若包含复杂的子查询,最外层查询则被标记 |
SUBQUERY | 子查询 |
DERIVED | 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表里。 |
UNION | 若第二个SELECT出现在UNION之后,则被标记为UNION; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DRIVED |
UNION RESULT | 从UNION获取结果 |
type
访问类型
字段
达到range级别,最好能到ref
# 常见
system > const > eq_ref > ref > range > index > ALL
# 全
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
字段 | 含义 |
---|---|
system | 单表一行记录,const特例 |
const | 表示通过索引一次查到,用于比较primary key或者unique索引。因为只匹配一行数据,所以很快, 如将主键置于where,MySQL就能将查询转换为常数。 |
eq_ref | 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。 常见于主键或唯一索引扫描或联表查询。 |
ref | 非唯一性索引扫描,返回匹配某个单独值的所有行。 |
range | 只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。 一般where里有between、>、 <、 in。 |
index | 全索引扫描,index与ALL区别为index类型只遍历索引树。 通常比ALL快,因为索引文件较小。 |
ALL | 全表扫描 |
possible_key(那些索引可以使用)
显示可能应用到这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但查询时不一定使用
key(哪些索引实际被使用)
实际使用的索引。如果为NULL,则没有使用索引。
若查询中使用了覆盖索引,则该索引仅出现在key列表中。
如果建索引顺序和个数与查询的顺序和个数相等,则出现possible_key中NULL,key中有。
key_len
表示索引中使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。为索引字段最大可能长度,并非实际使用长度。
ref(表之间的引用)
显示索引哪一列被使用了,如果可能的话,是一个常熟。哪些列或常量被用于查找索引列上的值。
rows(每张表有多少行被优化器查询)
根据表统计信息及索引选用情况,大致估算出找出所需记录所需读取的行数。
Extra(其它信息)
字段 | 含义 |
---|---|
Using filesort | 说明MySQL会对数据使用的一个外部的索引排序,二不是按照表内的索引顺序进行读取。 MySQL中无法利用索引完成的排序操作成为“文件排序”。 创建了文件排序,导致更加复杂,消耗资源更多。 |
Using temporary | 新建了内部临时表保存中间结果,常见于order by、group by,最差 |
Using index | 使用覆盖索引(Covering Index), |
Using where | 使用where |
Using join buffer | 使用了连接缓存 |
impossible where | 不存在满足where中的条件元素 |
distinct | 找到第一个匹配元素后即停止查找同样的值 |