MySQL Explain 性能分析

explain select * from t1 straight_join t2 on (t1.a=t2.a);

在这里插入图片描述

id

SQL执行的顺序的标识
从大到小的执行
id相同时,执行顺序由上至下

select_type

标识查询类型,普通查询和联合查询、子查询之类的复杂查询
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果)
(6) SUBQUERY(子查询中的第一个SELECT)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

table

表名.
有时:derivedx(x是个数字,第几步执行的结果)

mysql> explain select * from (select * from ( select * from t1 where id=2602) a) b;
±—±------------±-----------±-------±------------------±--------±--------±-----±-----±------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±------------±-----------±-------±------------------±--------±--------±-----±-----±------+
| 1 | PRIMARY | | system | NULL | NULL | NULL | NULL | 1 | |
| 2 | DERIVED | | system | NULL | NULL | NULL | NULL | 1 | |
| 3 | DERIVED | t1 | const | PRIMARY,idx_t1_id | PRIMARY | 4 | | 1 | |
±—±------------±-----------±-------±------------------±--------±--------±-----±-----±------+

type

访问类型
常用的类型性能优劣如下:
NULL>system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

ALL

Full Table Scan

index

Full Index Scan,只遍历索引树

range

只检索给定范围的行,使用一个索引来选择行

ref

某列或常量被用于查找索引列上的值

eq_ref: 类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system: 当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULL

不用访问表或索引
如从一个索引列里选取最小值

possible_keys

可能使用到的索引
possible_keys中键不按生成次序使用。

Key

实际使用的索引
强制使用或忽视possible_keys中的索引:
使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

key_len

索引中使用的字节数,不损失精确性的情况下,长度越短越好
(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

ref

哪些列或常量被用于查找索引列上的值

rows

找到所需的记录所需要读取的行数,innodb上是不准确

filtered

列给出了一个百分比的值,这个百分比值和rows 列的值一起使用,可以估计出那些将要和QEP(QEP:sql生成一个执行计划query Execution plan)中的前一个表进行连接的行的数目。前一个表就是指id 列的值比当前表的id 小的表。这一列只有在EXPLAIN EXTENDED 语句中才会出现。

Extra

Using where

列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤

Using temporary

表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询

Using filesort

MySQL中无法利用索引完成的排序操作称为“文件排序”

Using join buffer

改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

Impossible where

这个值强调了where语句会导致没有符合条件的行。

Select tables optimized away

这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

总结:

• EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
• EXPLAIN不考虑各种Cache
• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
• 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

发布了37 篇原创文章 · 获赞 1 · 访问量 750

猜你喜欢

转载自blog.csdn.net/yuhezheg/article/details/103656090