mysql-explain
usage
sql语句explain select|update ..;
| key | note |
|---|---|
| id | 编号标识 |
| select_type | 查询的类型 |
| table | 表 |
| partitions | 匹配的分区 |
| type | 表示表的连接类型 |
| possible_keys | 表示查询时,可能使用的索引 |
| key | 表示实际使用的索引 |
| key_len | 索引字段的长度 |
| ref | 列与索引的比较 |
| rows | 扫描出的行数(估算的行数) |
| filtered | 按表条件过滤的行百分比 |
| Extra | 执行情况的描述和说明 |
key
id
SELECT的查询序列号;
- id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
- 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
select_type
-
SIMPLE,简单SELECT不使用UNION或子查询等
-
PRIMARY(优先级),子查询中最外层查询,查询中若包含任何复杂的子部分,
最外层的select被标记为PRIMARY -
DERIVED,派生表的SELECT,FROM子句的子查询,(大部分时候primary,derived一起出现)
-
SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
-
DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
-
UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
-
UNION,
UNION中的第二个或后面的SELECT语句 -
DEPENDENT UNION, UNION中的第二个或后面的SELECT语句,取决于外面的查询
-
UNION RESULT(UNION的结果union语句中第二个select开始后面所有select
table
查询使用的表
type
ALL、index、range、 ref、eq_ref、const、system,从左到右,性能从差到好
- ALL:Full Table Scan, 不使用索引,全表扫描
- index: Full Index Scan, 使用索引全表扫描
range: 使用索引范围查询 =>上面的SQL基本都需要优化- ref: 使用普通索引,等值查询,返回多行数据;1:N
- eq_ref: 使用唯一索引等值查询,返回一行数据;1:1
- const,system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
possible_keys
可能使用的索引
key
实际使用的索引
key_len
索引的长度
rows
估算查询结果
filtered
查询条件过滤百分比
extra
- Using where
- Using temporary 使用临时币表,groupby, orderby
- Using join buffer, join没有使用索引,并使用了缓存