mysql explain 详解
语法及描述
语法
在 select 语句前加上 explain 关键字就可以
描述
获取查询操作的执行顺序
使用到的索引
成功返回结果需要执行的行数
字段含义
id
标识符, 表示执行顺序. id 一样则自上而下, 否则大的先执行.
select_type
查询类型
- simple: 不包含 union 操作或者不包含子查询的简单 select 查询
- primary: 需要 union 操作或者含有子查询的 select, 位于最外层的 select.type 即为 primary, 且只有一个.
- union:union 链接的两个 select 查询, 第一个是 primiary, 第二个之后的都是 union.
- Dependent union: 出现在 union 或 union all 语句, 但是这个查询要收到外部查询的影响.
- union result: 包含 union 的结果集, 在 union 和 union all 语句中, 因为它不需要参与查询,, 所以 id 字段为 null
- subquery: 除了 from 子句中包含的子查询外, 其他地方出现的子查询都可能是 subquery
- Dependent subquery: 与 dependent union 类似, 表示这个 subquery 的查询要受到外部表查询的影响
- derived:from 子句中出现的子查询, 也叫做派生表, 其他数据库中可能叫做内联师徒或嵌套 select
实例
1 | //外层是primary,内层是subquery |
partitions
表是分区表才行
type
查询结果类型
- const: 返回结果只有一个匹配行
- range: 索引范围扫描,常见于使用 >,<,is null,between ,in ,like 等运算符的查询中
- index: 索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
- index_merge: 使用了一张表的多个索引, 实际上由于要读取所个索引,性能可能大部分时间都不如 range
全表扫描数据文件 possible_keys & key
possible_keys: 查询可能使用到的索引都会在这里列出来。key: 查询真正使用到的索引,select_type 为 index_merge 时,这里可能出现两个以上的索引,其他的 select_type 这里只会出现一个。
key_len
用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。
留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了.
总结
通过对上面 explain 中的每个字段的详细讲解。我们不难看出,对查询性能影响最大的几个列是:
- select_type:查询类型
- type: 连接使用了何种类型
- rows: 查询数据需要用到的行
- key: 查询真正使用到的索引
- extra: 额外的信息
尽量让自己的 SQL 用上索引,避免让 extra 里面出现 file sort(文件排序),using temporary(使用临时表)。