explain
Explain可以用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。
explain重要属性分析
id
操作表的顺序,id值越大,优先级越高。
select_type
查询类型
类型 | 含义 |
---|---|
SIMPLE | 简单的查询,查询中不包含任务字查询和UNION查询 |
PRIMARY | 查询中若包含任何复杂的子部分,最外层查询为PRIMARY |
SUBQUERY | 衍生查询,from列表中包含的字查询 |
UNION | 若第二个select出现在union之后,则被标记为union |
UNION RESULT | union表获取的结果 |
type
为了保证查询至少达到range级别。最好达到ref,否则的话,只能说明这条语句性能有待提高。
system>const>eq_ref>ref(最好能达到)>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>ALL
system:表里只有一行记录(等于系统表)。
const:通过索引一次就找到了,主键索引或者唯一索引。
eq_ref:在连接查询时,如果被驱动表是通过主键或者唯一二级索引列等值匹配的方式进行访问的,则对该被驱动表的访问方法就是 eq_ref。这可能是在 const 之外最好的联接类型了。
ref:不使用唯一索引,而是使用普通索引或者唯一性索引的部分前缀,索引要和某个值相比较,可能会找到多个符合条件的行;表示所有具有匹配的索引的行都被用到。
range索引范围内查找between、>,<,in,>=, <=
index全索引树扫描
all全表扫描
possidble_key:
可能使用的索引
key:
显示使用的索引,如果没有使用,则显示NULL
###key_len:
索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精度的情况下,长度越短越好。key_len显示的值为索引字段的最大长度,并非实际长度,即key_len根据表定义计算而得,不是通过表内检索出的。
not null 会额外占用一个字节;
varchar 会额外占用两字节存储长度;
extra:额外重要信息
1、Using filesort 查询需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。对数据使用一个外部的索引排序。
2、Using temporary 查询需要优化了。表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询,常见 group by ; order by
3、using join buffer : 表明使用了连接缓存, join次数太多了可能会出现
4、Using index:使用覆盖索引的时候就会出现,不需要回表查询
5、Using where(mysql5.6:using index condition):在查找使用索引的情况下,需要回表去查询所需的数据
6、using index & using where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据
6、impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。
7、Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行