查询优化的百科全书 —— Explain 详解
1.Explain简介
⼀条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后⽣成⼀个所谓的执⾏计划,这个执⾏计划展示了接下来具体执⾏查询的⽅式,⽐如多 表连接的顺序是什么,对于每个表采⽤什么访问⽅法来具体执⾏查询等等。设计MySQL的⼤叔贴⼼的为我们提供了EXPLAIN语句来帮助我们,它的作用就是查看某个查询语句的具体执行计划
2.Explain各个字段分析
id: 在一个大查询里面,每个select关键字都对应一个id
select_type: select关键字对应的查询类型
- simple: 简单查询。查询语句中不包含UNION或者⼦查询的查询都算作是SIMPLE类型
- primary: 主查询。包含UNION、UNION ALL或者子查询的大查询来说,它是由几个小查询组成的,其中最左边的那个查询的select_type值就是PRIMARY
- subquery: 子查询。
- derived: 表子查询
- union: 联合查询。
- union result: 查询的联合查询临时表(因为联合查询默认去重,而去重工作是通过临时表来完成)
tables: 查询的表名
partitions: 查询的分区
type: 针对单表的访问方法
- const:
- ref:
- ref_or_null:
- range:
- index:
- all:
possible_keys: 理论上⽤到的索引
key: 实际上使⽤的索引
key_len: 实际使⽤到的索引⻓度
ref: 当使⽤索引列等值查询时,与索引列进⾏等值匹配的对象信息
- 某个字段:
- const: 常量
- null: 没有使用索引列等值查询
rows: 获取结果 预估的需要读取的记录条数
filtered: 某个表经过搜索条件过滤后剩余记录条数的百分⽐
Extra: ⼀些额外的信息
- using filesort: 在order by时无法利用索引完成排序,转而采用文件排序的方式
- using temporary: 索引列在group by时没有按照索引定义时的个数和顺序
- using index: 查询时用到了索引
- using where: 查询中用到了where
- using join buffer: 查询时用到了join。被驱动表(从表)
sing join buffer: 查询时用到了join。被驱动表(从表)