Mysql之说一说Explain
Posted not-miss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql之说一说Explain相关的知识,希望对你有一定的参考价值。
1.Explain是什么?
Explain关键字可以模拟优化器执行SQL查询语句,从而知道mysql是如何处理你的SQL语句。
分析你的查询语句或者表结构性能瓶颈
2.Explain 的用处?
- 表的读取顺序
- 数据读取操作的操作类型
- 那些索引可以使用
- 那些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
3.Explain各个字段的含义?
Explain+SQL语句
执行计划包含的信息【id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra 】
字段 | 描述 |
id |
id:select查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序 复合查询分析id的三种情况:
|
select_type | select_type:分析查询类型,主要区别普通查询,联合查询,子查询等的复杂查询
|
table | table:显示这一行的数据是关于那张表的 |
type |
type:访问类型排列 type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是: 分析:system > const > eq_ref > ref > range > index > all 各个词语的使用含义?
备注:一般来说,得保证查询至少达到range级别,最好能达到ref. |
possible_keys | possible_keys:显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引, 则该索引将被列出,但不一定被查询实际使用 |
key | key:1.实际使用的索引。如果为null,则没有使用索引.2.查询中若使用了覆盖索引,则该索引仅出现在key类表中 |
key_len |
key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好 key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的 |
ref | ref:显示索引的那一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值 |
rows | rows:根据表统计信息及索引选用情况,大致估算出找到所需要的记录所需要读取的行数,越小越好 |
Extra |
Extra:包含不合适在其它列中显示但十分重要的额外信息
|
4.练一练Explain
练习题(1)
mysql> explain select t2.* from ( ->select t3.id ->from t3 ->where t3.other_column = ‘‘)s1,t2 ->where s1.id = t2.id; +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | <derived2> | system | null | NULL | NULL | NULL | 1 | | | 1 | PRIMARY | t2 | const | PRIMARY | PRIMARY | 4 | const| 1 | | | 2 | DERIVED | t3 | ALL | null | NULL | NULL | NULL | 1 | Using where | +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ 3 rows in set (0.01 sec)
分析:id值越大优先级越高,越先被执行;id相同执行顺序由上至下
执行顺序1:根据id=2,则先执行(select t3.id from t3 where t3.other_column = ‘ ‘)sql语句
执行顺序2:再根据id=1,两个id相同,执行顺序从上到下 ,从table列<derived2>derived代表临时表,derived2中2代表id=2,加载临时表s1
执行顺序3:临时表s1 和 表t2 连接执行
练习题(2)
mysql> explain select d1.name,(select id from t3) d2 ->from (select id,name from t1 where other_column = ‘‘) d1 ->union ->(select name,id from t2); +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ | 1 | PRIMARY | <derived3> | system | null | NULL | NULL | NULL | 1 | | | 3 | DERIVED | t1 | all | null | NULL | NULL | NULL | 1 | Using whrere| | 2 | SUBQUERY | t3 | index | null | PRIMARY | 4 | NULL | 1 | Using index | | 4 | UNION | t2 | all | null | NULL | NULL | NULL | 1 | | |null| UNION RESULT | <union1,4> | all | null | NULL | NULL | NULL | NULL | | +----+--------------+------------+--------+---------------+---------+---------+------+------+-------------+ 5 row in set (0.01 sec)
分析:
执行顺序1:根据id=4,select_type为union【说明第四个select是union里的第二个select】 table列为t2, 最先执行该sql语句(select name,id from t2)
执行顺序2:id=3,t1 说明第三个select语句 该语句是from子查询 所以为derived (select id,name from t1 where other_column = ‘‘)
执行顺序3:id=2,subquery 为子查询 t3 说明第二个select语句 (select id from t3)
执行顺序4:id=1,primary表示最外层查询,derived3其中3是id=3的临时表 (select d1.name,.....)
执行顺序5:从union Result 表示从union字段上面的sql获取到结果集, <union1,4>表示用 id1和4 也就是第一个select查询结果和第四个select查询结果进行union操作
以上是关于Mysql之说一说Explain的主要内容,如果未能解决你的问题,请参考以下文章