调用分析指令分析sql再进行对应的调优
explaion select ...
十个参数:
id:编号
select_type:查询类型
table:表
type:索引类型
possible_keys:预测可能用到的索引
key:实际使用的索引
key_len:实际使用的索引的长度
ref:表之间的引用
rows:通过索引查询到的数据个数
Extra:额外信息
- id 编号
id编号代表了执行的顺序。
id相同从上到下执行。
id越大执行优先级越大。
- select_type 查询类型
SIMPLE:简单查询,不包含子查询、UNION查询
PRIMARY:主查询,包含子查询SQL中的最外层SELECT语句
SUBQUERY:子查询,包含子查询SQL中内层的SELECT语句
DERIVED:衍生查询,使用到了临时表的查询(一个子查询查的临时结果表)
UNION:联合查询,使用到了UNION的查询
UNION RESULT:告知SQL编写者,那些表之间存在UNION查询
- table 查的那张表
如果包含子查询,主查询是衍生表。子查询是具体表
- type 索引类型
索引类型的性能由高到低依次是:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subsquery>range>index>all
各个级别如下:
(1) system:只有一条数据的系统吧或衍生表只有一条数据的主查询。
(2) const:只能查询到一条数据。
(3) eq_ref:唯一性索引。查询结果有多条,但是每个索引值对应的数据是唯一的。
(4) ref:非唯一性索引。查询结果有多条,每个索引值对应的数据是0或者多条。
(5) range:在某个范围内使用索引了。(in会导致索引失效进而显示的类型是all)
(6) index:全索引扫描,查询索引里的全部数据,但不会查询表里的所有数据
(7) all:全表扫描,会查询全部表中的数据
- possible_keys和key
可能使用的索引和真正使用的索引,如果没有走索引为null
- key_len
索引长度,判断复合索引是否被完全使用
- ref 表之间的引用
查询语句的表关联情况
- Extra
(1) using filesort:需要额外执行一次排序(查询),根据where查出来的顺序和order by的顺序不一致,导致要进行额外的排序。
单索引:select * from xx where a1=' ' order by a2
出现filesort
复合索引:如果建立复合索引,where与order by需要按照复合索引顺序使用,否则出现filesort。比如复合索引a1,a2,a3 select * from xx where a1=' ' order by a3
会出现filesort
(2) using temporary:查询时用到了临时表,常出现在group by中。避免方法:where筛选那些列,就根据那些列group by
(3) using index:使用了覆盖索引,不需要回表
(4) using where:回表了
(5) using index condition:先索引过滤了一部分,然后再通过其他条件再过滤以及过滤的部分
(6) impossible where:where永远为false