MySql的Explain命令使用
explain命令是mysql自带的一个命令,用于解释Mysql将如何处理SQL,执行顺序和是否使用了索引之类,我们平常可以用于SQL调优。
用法则是,在SQL前面加上这个命令,比如我们的SQL为,select * from table ,那么我们使用这个命令则是 explain select * from table。
这里我们运行一下命令,会得出一个表格:
接下里我们逐个字段来解释含义
id (较重要)
可以理解成SQL的执行顺序,id值越大,表明越先执行,如果id一样,则按照从上往下的顺序进行执行。
select_type (不重要)
表示查询的类型,常用有以下一些值
- simple : 最简单的查询,不涉及表关联之类的
- primary: 当涉及复杂查询时,这个标识着最外层的select查询
- union : union关键词后的select语句
- subquery : 子查询中的第一个select
- derived : 包含在
from
子句中的子查询的select
table(不重要) 表名,无实际意义
type (很重要,可以优化的大点)
性能从高到底:system > const > eq_ref >ref > ref_or_null >index_merge > unique_subquery > index_subquery > range > index > all
这里说明几个常用的含义
- system : 当表中只有一行数据会出现这个,非常快 (不需要优化)
- const : 表示查询命中了主键或者唯一索引 (不需要优化)
- eq_ref : 表示查询命中了主键或者索引 (不需要优化)
- ref : 表示查询命中了非唯一性的索引 (可以略微优化使关联条件的字段为唯一索引)
- range : 表示使用的索引选择了一个范围内进行查询 (不需要优化)
- all : 没有使用索引,扫描了全表 (可以考虑建立索引或改变SQL写法)
possible_key(了解)
表示Mysql可能使用哪个字段来进行表关联查询,也就是这些推荐的Key,是可以加索引的
key(非常重要)
表示Mysql在查询中使用到的索引,就是真正的索引,如果为null,则表示没有用到索引,需要进行优化。
key_len(了解)
表示查询用到的索引长度(字节数),原则上长度越短越好。
ref(了解)
表示表连接之间的匹配关系,比如常量(const), 函数(func),字段名等
rows(比较重要)
表示需要扫描的行数,行数越大,表示需要扫描的数据量越大,那么自然而然就会越慢了
extra(非常重要) : 表示额外信息
具体的枚举值可以参考官方文档 : https://dev.mysql.com/doc/refman/5.7/en/explain-output.html#jointype_index_merge
这里列举一些常用的
- Using Index: 表示用到了索引,速度会很快
- Using where: 没有用到索引,而是用到了where条件来进行过滤
- Using temporary : 用到了临时表,一般在排序或分组时会出现
- Using filesort: 没有利用索引来进行排序,也就是排序的字段上没有索引
- Using join buffer: 连表查询时,连接条件没有用到索引
- Impossible where: where条件有问题