EXPLAIN :mysql 5.6后的版本都支持查看 '增删改查 '的 执行计划(执行的顺序,索引类型......)
先了解下 MYSQL sql语句的执行流程
SELECT * from bx_order where orderid >'12' GROUP BY categoryid HAVING count(1) > 3 ORDER BY categoryid LIMIT 10,100
加载 bx_order 表 → where 条件判断 → group by 字段 → 聚合函数count(1) → having条件判断 → order by排序 → limit 分页
EXPLAIN语法(MySQL5.7版本)
EXPLAIN Output Columns
Column | JSON Name | Meaning | 备注 |
---|---|---|---|
id | select_id | The SELECT identifier | id越大 越早执行 id相同 顺序自上而下执行 |
select_type | None | The SELECT type | SIMPLE:简单SELECT(不使用UNION或子查询) ......(省略了 非重要的) |
table | table_name | The table for the output row | 输出的行所引用的表 |
partitions | partitions | The matching partitions | 查询将匹配记录的分区。该值适用NULL 于非分区表 |
type | access_type | The join type | 从好到差依次为:system,const,eq_ref,ref,fulltext,ref_or_null,index_merge,unique_subquery,index_subquery,range,index,ALL
1、system:The table has only one row (= system table)表中只有一行数据或者是空表。 |
possible_keys | possible_keys | The possible indexes to choose | 查询可能使用到的索引都会在这里列出来 |
key | key | The index actually chosen | 查询真正使用到的索引 |
key_len | key_length | The length of the chosen key | 索引长度,没有索引则为Null |
ref | ref | The columns compared to the index | 显示将哪些列或常量与列中指定的索引进行比较 |
rows | rows | Estimate of rows to be examined | 影响的行数 |
filtered | filtered | Percentage of rows filtered by table condition | 该filtered 列指示将按表条件过滤的表行的估计百分比。最大值为100,这意味着不会对行进行过滤。值从100开始减少表示过滤量增加。 |
Extra | None | Additional information | 额外的信息(重要) |
Extra 这个是包含了一些十分重要的额外信息,也是非常重要的一个字段。
他可能包含以下一个或多个值:
1、using filesort,这个说明mysql无法利用索引进行排序,那他只能用排序算法重新进行排序了,这会额外消耗资源。出现这个的话那么说明这条SQL需要优化了,需要正确使用索引或者建立合适的索引。
下面是一个让MySQL使用正确索引的例子,同样的结果,不一样的过程。
但是具体那条SQL更快呢,也不一定,根据具体情况而定,比如数据规模之类的。还有就是开发当中一般是不允许用select * 的,要什么字段就拿什么字段,不然会造成性能浪费。
2、using temporary,建立了临时表来保存中间结果,查询完成之后又要把临时表删除。出现这样的情况说明这条SQL语句请一定要优化,如果这样的SQL一多的话非常影响系统的性能。
3、using index,前面也说过,这个表示当前的查询是覆盖索引的,直接从索引中读取数据,而不用访问数据表。如果同时出现using where表明索引被用来执行索引键值的查找,如果没有using where,表面索引被用来读取数据,而不是进行查找。
4、using where,使用了where进行条件过滤。
5、using join buffer、表示使用了连接缓存。
6、impossible where,where语句的值总是false。
7、Distinct,一旦MySQL找到了与行相联合匹配的行,就不再搜索了。
重点
type:访问类型,查看SQL到底是以何种类型访问数据的。
key:使用的索引,MySQL用了哪个索引,有时候MySQL用的索引不是最好的,需要force index()。
rows:最大扫描的列数。
extra:重要的额外信息,特别注意损耗性能的两个情况,using filesort和using temporary。