mysql explain 命令讲解

explian命令可以显示select语句的执行计划

explain的结果中每行对应select语句中的一个表,输出结果中的顺序是按照语句处理表的顺序。 mysql使用嵌套循环来处理所有的join连接。 当使用了关键字extended后,explain可以查看到"show warnings"语句的内容,以及被过滤的列。

关键字"extented"和"partitions"不能一起使用,在5.6.5之后,这两个关键字都不可以和"format"一起使用。

mysql> explain select * from emp ,dept where emp.deptno=dept.deptno;
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | emp   | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  1 | SIMPLE      | dept  | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
2 rows in set (0.00 sec)

mysql> explain select * from dept,emp where emp.deptno=dept.deptno;
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | dept  | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  1 | SIMPLE      | emp   | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+-------+--------+---------------+------+---------+------+------+-------+
2 rows in set (0.00 sec)

mysql> explain select * from (select * from ( select * from emp where id=1) a) b;
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
| id | select_type | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
|  1 | PRIMARY     | <derived2> | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  2 | DERIVED     | <derived3> | system | NULL          | NULL | NULL    | NULL |    1 |       |
|  3 | DERIVED     | emp        | system | NULL          | NULL | NULL    | NULL |    1 |       |
+----+-------------+------------+--------+---------------+------+---------+------+------+-------+
3 rows in set (0.01 sec)

mysql>

1.id (JSON name: select_id)
 select标识符,在查询中该值是顺序的数字。如果该行是其它行union的结果,该值可以为null。

2.select_type (JSON name: none)

select_type的取值列表

取值 json name 说明
simple   简单的select查询(没有union、没有子查询)
primary   最外层的查询
union   union中的第二个或后面的select语句
dependent union dependent (true) union中的第二个或后面的select语句,对外查询有依赖
union result union_result union的结果集
subquery   子查询中的第一个查询
dependent subquery dependent (true) 子查询中的第一个查询,对外层查询有依赖
derived   派生表的select(from子句的子查询)
materialized materialized_from_subquery 物化的子查询
uncacheable subquery cacheable (false) 结果不能被缓存的子查询,外层查询需要使用的时候都要重新执行一次
uncacheable union cacheable (false) union中的第二个或者后面的不能被缓存的子查询

3.table (JSON name: table_name)  

<unionM,N>:表示是M行和N行结果的union;<derivedN>:表示派生自N行的结果;<subqueryN>: 引用N行的物化的子查询

4.partitions (JSON name: partitions)
 查询涉及的分区

5.type (JSON name: access_type)
 join的类型

6.possible_keys

possible_keys列指出MySQL可以使用的索引。注意,该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。

如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

7.key (JSON name: key)

显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。

要想强制MySQL使用或不使用possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

8.key_len (JSON name: key_length)

key_len列显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。 使用的索引的长度。在不损失精确性的情况下,长度越短越好

9.ref (JSON name: ref)

ref列显示使用哪个列或常数与key一起从表中选择行。

10.rows (JSON name: rows)

rows列显示MySQL认为它执行查询时必须检查的行数。

11.filtered (JSON name: filtered)

表的行数的过滤的百分比

12. Extra

包含MySQL执行查询使用的其它信息:

看到 Using filesort 和 Using temporary 的时候,查询就需要优化了。

时间: 2024-11-20 13:28:31

mysql explain 命令讲解的相关文章

mysql explain 命令解释

转载http://bzyyc.happy.blog.163.com/blog/static/6143064720115102551554/ key实 际使用的索引.如果为NULL,则没有使用索引.很少的情况下,MYSQL会选择优化不足的索引.这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引 key_len使用的索引的长度.在不损失精确性的情况下,长度越短越好 mysql

【MySQL笔记】SQL优化利器 - explain命令的输出格式详解

有MySQL使用经验的同学在实际项目中可能会遇到SQL慢查询的场景,有些场景很容易定位问题所在(如单表操作有慢查询SQL时,仔细check SQL语句通常很容易定位索引问题),而有些复杂业务场景下(如多表联合查询几十个字段并做group或sort等操作),人工check SQL语句通常很难发现SQL瓶颈根源.这个时候,MySQL提供的explain命令就派上用场了. 本笔记主要对explain的输出结果做说明,并给出根据explain输出对SQL做优化的思路. 1. EXPLAIN语法及用途 e

Mysql中explain命令查看语句执行概况

Mysql中可以使用explain命令查看查询语句的执行方式,使用方法举例:explain + 查询语句 例如:explain select * from user_info 几个重要的字段说明: table:此次查询操作是关联哪张数据表 type:连接查询操作类型,一般根据索引查询的话为const,如果没有索引,则遍历所有数据那么为All(此种方式效率极低) possible_keys:显示可能应用在这张表中的索引.如果为空,没有可能的索引. key: 实际使用的索引.如果为NULL,则没有使

MySQL中EXPLAIN命令详解

explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: explain select surname,first_name form a,b where a.id=b.id EXPLAIN列的解释: table:显示这一行的数据是关于哪张表的 type:这是重要的列,显示连接使用了何种类型.从最好到最差的连接类型为const.eq_reg.ref.range.in

mysql优化命令:explain

原文地址:http://www.cnblogs.com/magialmoon/p/3439042.html#id 在园子里偶然看到这篇文章,感觉十分不错,全面,思路清晰,因为自己也一直想做一些常用命令的总结,就先拿过来用了,感谢原作者! 1.测试环境 2.explain介绍 2.1 id 2.2 select_type 2.3 table 2.4 type 2.5 possible_keys 2.6 key 2.7 key_len 2.8 ref 2.9 rows 2.10 Extra 3.总结

MYSQL EXPLAIN执行计划命令详解(支持更新中)

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所以有些话语未必准确,请自行查看官网,若有些点下面没有例子的是因为当时一下子没有想出那么多来,如果大家有遇上好的例子,欢迎在下面留言我持续更新 查看执行计划的关键EXPLAIN 版本MYSQL5.6,用到的库是官网例子sakila,自行下载导入 由于要把每个点都翻译出来,还需要举例,所以需要一定的时间

MySQL的Explain命令

Explain命令是查看查询优化器如何决定执行查询的主要办法. 调用 EXPLAIN 要使用EXPLAIN,只需在查询中的SELECT关键字之前增加EXPLAIN.MySQL会在查询上设置一个标记.当执行查询时,这个标记会使其返回关于在执行计划中每一步的信息,而不是执行它(一般情况下).它会返回一行或多行信息,显示出执行计划中的每一部分和执行的次序. explain select 1结果示例: 在查询中每个表在输出中只有一行.如果查询是两个表的连接,那么输出中将有两行.别名表单算为一个表.如果把

mysql的查询使用explain的讲解

摘自:http://www.jb51.net/article/33736.htm 在 explain的帮助下,您就知道什么时候该给表添加索引,以使用索引来查找记录从而让select 运行更快.如果由于不恰当使用索引而引起一些问题的话,可以运行 analyze table来更新该表的统计信息,例如键的基数,它能帮您在优化方面做出更好的选择. explain 返回了一行记录,它包括了 select语句中用到的各个表的信息.这些表在结果中按照mysql即将执行的查询中读取的顺序列出来.mysql用一次

【MySQL】EXPLAIN命令详解

具体参考: https://www.cnblogs.com/gomysql/p/3720123.html 原文如下: 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成.EXPLAIN命令是查看优化器如何决定执行查询的主要方法.可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及