Mysql-Explain(一):explain简介和输出列解释

explain简介

explain和SQL语句一起使用的时候,MySQL将显示来自优化器的相关语句执行计划的信息,包括表的读取顺序、数据读取操作的操作类型、那些索引可以被使用、那些索引会被实际使用、表之间的引用、每张表大概需要读取多少行记录等等。通过这些我们能分析SQL语句的结构和性能瓶颈,从而优化我们的SQL语句。

example:

mysql> explain select * from student where id < 10;
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | student | NULL       | range | PRIMARY       | PRIMARY | 4       | NULL |    9 |   100.00 | Using where |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.24 sec)

explain输出列解释

字段 字段说明 字段值描述
id select查询序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序 id相同 执行顺序由上至下
id不相同 如果是子查询,id的序号会递增,id的值越大被执行的优先级越高
id相同和不相同都存在 如果id相同可以认为是一组,同一组id执行顺序由上至下,不同组之间,id值越大被执行的优先级越高
select_type 查询的类型,主要用来区别普通查询,联合查询,子查询等复杂查询 SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中若包含任何复杂的子部分,最外层的查询则被标记为PRIMARY
SUBQUERY 在select或者where列表中包含了子查询
DERIVED 在from列表中包含的子查询会被标记为DERICED(衍生),Mysql会递归地执行这些子查询,然后把结果放到临时表
UNION 若第二个select语句出现在UNION之后,则被标记为UNION。若UNION包含在from子句的子查询中,外层select则被标记为DERIVED
UNION RESULT 从union表获取结果的select
type 访问类型排序,显示查询使用了何种类型,从最好到最差依次是:system>const>eq_ref>ref>range>index>ALL system 表只有一行记录,这是const类型的特例,这个平时很少出现
const 表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行记录匹配,所以这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
eq_ref 驱动表和关联表中的每行进行组合并且仅有一行记录。这是除了system 和 const 类型之外, 这是最好的联接类型。当连接使用索引的所有部分时, 索引是主键或唯一非 NULL 索引时, 将使用该值
ref 非唯一性索引扫描,返回符合某个索引值的所有记录,可能会有多条记录匹配
range 使用一个索引来检索给定范围的行,这种范围索引扫描比全表扫描效率要高
index 使用覆盖索引
all 全表扫描(full table scan)
possiable_keys 显示可能应用在这张表中的索引,一个或者多个,查询的涉及的字段若存在索引,则该索引被列出,但是不一定被查询实际用到
key 实际使用的索引,如果为NULL,则没有使用索引;若查询中使用了覆盖索引,则该索引只会出现在key列表中
key_len 表示索引中使用的字节数,可通过该列计算查询中所使用索引的长度,在损失精度的情况下,索引长度越短越好;key_len显示的值为索引字段最大的可能长度,并非实际使用的长度,即key_len是根据表的定义计算而得,并非通过表内检索出的
ref 哪些列或者常量被用做索引列上的值
rows 根据表的统计信息和索引的使用情况,大致估算查询结果所需要读取记录的行数
extra 包含其explain字段不适合显示但又十分重要的额外信息 using filesort 使用文件内排序
using tmporary 使用临时表保存中间结果,常见于排序order by和分组group by
Using index 表示覆盖索引即可满足查询要求,因而无需再回表查询
Using index for group by 读取和分组都使用了覆盖索引
Using where Server层对存储引擎层返回的数据做where条件过滤
impossiable where where的值总fasle,不能获取任何记录
Using join buffer 联表查询时使用的缓存策略,有Block Nested-Loop Join和Batched Key Access两种策略
Select tables optimized away 在没有group by子句的情况下,基于索引优化的MAX/MIN操作,或者基于MyISAM存储引擎优化的COUNT(*)操作,不必等到执行阶段再进行计算,在查询计划生成阶段既可以完成优化
Distinct 优化Distinct操作,在找到匹配的第一行记录后,立马停止查找同样的值

猜你喜欢

转载自blog.csdn.net/u012180773/article/details/104138550
今日推荐