explain作用:
使用EXPLAIN关键字可以模拟优化器执行SQL语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是结构的性能瓶颈。
通过explain可以得到以下信息:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
语法:
explain + sql语句
主要字段包括id、select_type、table、partitions、type、possible_keys、key、ref、rows、filtered、extra,各字段含义如下:
id:
- select查询的序列号,表示查询执行select字句或操作表的顺序,执行顺序从大到小执行。
- 当包含子查询的时候。先执行子查询,所以id值最大。
select_type:
表示查询中每个select字句的类型,常用种类有:
类型 | 含义 |
---|---|
Simple | 查询中不包含子查询或者union |
Primary | 查询中若包含任何复杂的子部分,最外层查询被标记为Primary |
subquery | 在select或where列表中包含了子查询,该子查询被标记为subquery |
Derived | 在from列表中包含的子查询,被标记为Derived |
union | 若第二个select出现在union后,则被标记为union |
union result | 从union表获取结果的select被标记为union result |
table:
表名称
type:
表示mysql在表中找到所需行的方式,常见有:
ALL:mysql进行全表扫描,性能最差
index:全表扫描,但是只遍历索引树
range:对索引的扫描开始于某一点,返回匹配值,常见于between,>,<的查询
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,使用非唯一索引或唯一索引的非唯一前缀进行的查询
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引值
const:表最多只有一行匹配,用于主键或者唯一索引
system:表只有一行
fulltext:全文搜索
ref_or_null:与ref类似,但包括null
index_merge:出现了索引合并优化(包括交集,并集以及交集之间的并集)
unique_subquery:在in查询三种
possible_keys:
显示查询可能使用那些索引来查找
- explain查看执行计划,可能出现possible_keys有列,而key显示null的情况,这种情况是因为表中数据不多,mysql认为索引对这个查询帮助不大,选择了全表扫描
- 如果possible_keys列为null,则没有相关的索引,这种情况,可以通过检查where字句看是否可以创建一个适当的索引来提高查询性能
key:
显示mysql采用那个索引来优化对该表的访问
如果没有使用索引,该列为null,想强制mysql使用或忽略possible_keys列中的索引,在查询中使用force idnex
key_len:
显示了mysql在索引里使用的字节数,通过整个值可以算出具体使用了索引中的那些列
ref:
显示了在key列记录的索引中,表查找所用到的列或常量,常见的有:const(常量),id(字段名)
rows
mysql要扫描多少行数据,才能找到你要的数据
Extra额外的信息
Using index:使用覆盖索引
Using where:使用where语句来处理,并且查询的列没有被所有覆盖
user index condition:查询的列不完全被所有覆盖,where条件中是一个查询的范围
using temporary:mysql需要创建一张临时表来处理查询
using filesort:将用外部排序而不是索引排序,数据较小的时候从内部排序,否则需要在磁盘完成排序