mysql explain possible_keys_MySQL explain详解

Explain简介

本文主要讲述如何通过 explain 命令获取 select 语句的执行计划,通过 explain 我们可以知道以下信息:表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。

下面是使用 explain 的例子:

在 select 语句之前增加 explain 关键字,MySQL 会在查询上设置一个标记,执行查询时,会返回执行计划的信息,而不是执行这条SQL(如果 from 中包含子查询,仍会执行该子查询,将结果放入临时表中)。

mysql> explain select * fromactor;+----+-------------+-------+------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+------+-------+

| 1 | SIMPLE | actor | ALL | NULL | NULL | NULL | NULL | 2 | NULL |

+----+-------------+-------+------+---------------+------+---------+------+------+-------+

在查询中的每个表会输出一行,如果有两个表通过 join 连接查询,那么会输出两行。表的意义相当广泛:可以是子查询、一个 union 结果等。

explain 有两个变种:

1)explain extended:会在 explain  的基础上额外提供一些查询优化的信息。紧随其后通过 show warnings 命令可以 得到优化后的查询语句,从而看出优化器优化了什么。额外还有 filtered 列,是一个半分比的值,rows * filtered/100 可以估算出将要和 explain 中前一个表进行连接的行数(前一个表指 explain 中的id值比当前表id值小的表)。

mysql> explain extended select * from film where id = 1;+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+

| 1 | SIMPLE | film | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |

+----+-------------+-------+-------+---------------+---------+---------+-------+------+----------+-------+

mysql>show warnings;+-------+------+--------------------------------------------------------------------------------+

| Level | Code | Message |

+-------+------+--------------------------------------------------------------------------------+

| Note | 1003 | /*select#1*/ select '1' AS `id`,'film1' AS `name` from `test`.`film` where 1 |

+-------+------+--------------------------------------------------------------------------------+

2)explain partitions:相比 explain 多了个 partitions 字段,如果查询是基于分区表的话,会显示查询将访问的分区。

explain 中的列

接下来我们将展示 explain 中每个列的信息。

1. id列

id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。MySQL将 select 查询分为简单查询和复杂查询。复杂查询分为三类:简单子查询、派生表(from语句中的子查询)、union 查询。

1)简单子查询

mysql> explain select (select 1 from actor limit 1) fromfilm;+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

| 1 | PRIMARY | film | index | NULL | idx_name | 32 | NULL | 1 | Using index |

| 2 | SUBQUERY | actor | index | NULL | PRIMARY | 4 | NULL | 2 | Using index |

+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+

2)from子句中的子查询

mysql> explain select id from (select id from film) asder;+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+

| 1 | PRIMARY | | ALL | NULL | NULL | NULL | NULL | 2 | NULL |

| 2 | DERIVED | film | index | NULL | idx_name | 32 | NULL | 1 | Using index |

+----+-------------+------------+-------+---------------+----------+---------+------+------+-------------+

这个查询执行时有个临时表别名为der,外部 select 查询引用了这个临时表

3)union查询

mysql> explain select 1 union all select 1;+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+

| 1 | PRIMARY | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |

| 2 | UNION | NULL | NULL | NULL | NULL | NULL | NULL | NULL | No tables used |

| NULL | UNION RESULT | | ALL | NULL | NULL | NULL | NULL | NULL | Using temporary |

+----+--------------+------------+------+---------------+------+---------+------+------+-----------------+

union结果总是放在一个匿名临时表中,临时表不在SQL总出现,

你可能感兴趣的:(mysql,explain,possible_keys)