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列的值有三种情况:
- id相同,执行顺序由上而下
- id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先执行
- 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 | EXPLAIN |
输出如下:
可以看到,输出中的 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