mysql explain 详解

mysql explain 详解

语法及描述

语法

在 select 语句前加上 explain 关键字就可以

描述

获取查询操作的执行顺序
使用到的索引
成功返回结果需要执行的行数

字段含义

id

标识符, 表示执行顺序. id 一样则自上而下, 否则大的先执行.

select_type

查询类型

  1. simple: 不包含 union 操作或者不包含子查询的简单 select 查询
  2. primary: 需要 union 操作或者含有子查询的 select, 位于最外层的 select.type 即为 primary, 且只有一个.
  3. union:union 链接的两个 select 查询, 第一个是 primiary, 第二个之后的都是 union.
  4. Dependent union: 出现在 union 或 union all 语句, 但是这个查询要收到外部查询的影响.
  5. union result: 包含 union 的结果集, 在 union 和 union all 语句中, 因为它不需要参与查询,, 所以 id 字段为 null
  6. subquery: 除了 from 子句中包含的子查询外, 其他地方出现的子查询都可能是 subquery
  7. Dependent subquery: 与 dependent union 类似, 表示这个 subquery 的查询要受到外部表查询的影响
  8. derived:from 子句中出现的子查询, 也叫做派生表, 其他数据库中可能叫做内联师徒或嵌套 select

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
//外层是primary,内层是subquery
explain select * from student s where s. classid = (select id from classes where classno='2017001');

//结果有三行,第一行是primary,第二行是union,第三行是union result
explain select * from student where id = 1 union select * from student where id = 2;

//结果有四行,分别是primary,dependent subquery,dependent union,union result
explain select * from student s where s.classid in (select id from classes where classno='2017001' union select id from classes where classno='2017002');

//跟mysql版本有关
explain select * from (select * from student) s;
table
显示查询语句所查询的表名,如果查询使用了别名,那么这里使用的是别名.如果不涉及对数据表的操作,显示为null;有一种特殊情况,如果显示为,,则都是临时表.M,N代表的id,表示结果来自于这个查询产生

partitions

表是分区表才行

type

查询结果类型

  1. const: 返回结果只有一个匹配行
  2. range: 索引范围扫描,常见于使用 >,<,is null,between ,in ,like 等运算符的查询中
  3. index: 索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
  4. index_merge: 使用了一张表的多个索引, 实际上由于要读取所个索引,性能可能大部分时间都不如 range
    全表扫描数据文件
  5. possible_keys & key
    possible_keys: 查询可能使用到的索引都会在这里列出来。

  6. key: 查询真正使用到的索引,select_type 为 index_merge 时,这里可能出现两个以上的索引,其他的 select_type 这里只会出现一个。

  7. key_len
    用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。

留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了.

总结

通过对上面 explain 中的每个字段的详细讲解。我们不难看出,对查询性能影响最大的几个列是:

  • select_type:查询类型
  • type: 连接使用了何种类型
  • rows: 查询数据需要用到的行
  • key: 查询真正使用到的索引
  • extra: 额外的信息
    尽量让自己的 SQL 用上索引,避免让 extra 里面出现 file sort(文件排序),using temporary(使用临时表)。
多谢支持