MySQL Explain详解


MySQL的Explain相信大家都不陌生,通常在分析SQL查询语句的性能的时候会用到。使用Explain关键字可以模拟MySQL优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。Explain关键字可以分析SQL语句或表结构的性能瓶颈。

1. Explain语句作用

Explain关键字的详细介绍,可以参考官网:MySQL官网介绍

Explain语句的作用概括如下:

  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询

2. Explain用法

用法很简单,直接用 Explain + SQL语句。

3. Explain输出

Explain输出如下图:

下面将详细介绍每一列输出的含义。

3.1. id

id代表select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。

id列的值有三种情况:

  1. id相同,执行顺序由上而下
  2. id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先执行
  3. id相同、不同的同时存在,参照以上两条原则:相同,由上而下执行;不同,id越大越先执行

详细例子说明如下:

3.1.1. id相同

1
EXPLAIN SELECT * FROM `employees` e, `salaries` s WHERE e.`emp_no` = s.`emp_no`;

输出如下:

可以看到,输出中的id值相同,所以在这条SQL中,表执行的顺序由上而下:即先查e(employees)表,后查s(salaries)表

3.1.2. id不同

1
2
3
4
5
6
EXPLAIN 
SELECT * FROM `salaries` s
WHERE emp_no = (
SELECT `emp_no` FROM `employees` e
WHERE `first_name` = 'Steen' AND `last_name` = 'Escriba'
);

输出如下:

可以看到,输出中的 id 列,值各不相同,根据前面的规则,id不同的,值越大的越先执行,所以先查e(employees)表,后查s(salaries)表。

这根我们常规的理解也是符合的,上面这条语句是一个嵌套了子查询的查询语句,当然是先执行 子查询 中的语句,Explain中id的输出也印证了这一点。

3.1.3. id有相同的和不同的

3.2. select_type

select_type表示当前查询的类型,主要用于区别普通查询、联合查询、子查询等复杂查询,其值如下:

  • simple:简单的select查询,查询中不包含子查询或者union
  • primary:查询中若包含任何复杂的子部分,最外层则被标记为primary
  • subquery:在select或where列表中包含子查询
  • derived:在from表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放到临时表里
  • union:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层select被标记为derived
  • union result:从union表里获取结果的select