使用explain查看详细执行计划
可以使用explain关键字来查看对应SQL的执行计划, 使用方式是 直接在 SQL语句前面加 explaion即可。
查看计划的时候,我们会看到以下的信息:
执行计划
分析执行计划的每列是什么东西:
id
每个执行计划都会有一个id,如果SQL复杂,会有多个执行计划,那么会对应有多个id。例如子查询,如果有一个子查询的话,那么子查询的id可能就是2了。
select_type
查询的类型
值有:
SIMPLE 一般的简单查询就是这个类型。
PRIMARY 有子查询嵌套的查询,主查询就会是这个类型。
SUBQUERY 有子查询的嵌套查询,子查询的执行计划就是这个类型。
UNION 合并查询,会是这个类型。
DERVIED 物化临时查询,有时候我们会对一个查询结果进行查询,这时候这个查询结果的SQL子句的自行计划就是这个类型,意思是创建一个临时的表,保存查出来的结果。主查询会对这个临时的表进行查询扫描。
table
对应查询的表
type
查询数据的类型,筛选数据的方式,就是执行计划的类型, const、ref、range、index、all这些。
index_merge 使用索引进行查询,然后提取交集的类型。
possible_keys
和type结合起来看,意思是可以使用的各个列,或者索引列。
key
和possible_keys结合起来看,就是实际使用的索引的列。 possible_keys是多个可能是用的列,key就指明了使用了哪列。
key_len
索引的值长度。
ref
指明在使用索引等值查询的时候,什么类型的值和索引值进行匹配。例如这个字段的值是const,意思是,查询的时候,使用常量值和索引的值进行匹配。意思是 name = ‘123’ , 等号后面的数据的类型。 这里是常量。
rows
估计这个执行计划,需要扫描的行数。
Extra
字段以外的内容,保存一些额外的信息 , 例如上图中,有一个 Block Nested Loop , 意思是嵌套循环, 查询这张表的时候使用了嵌套循环查询的方式。 也使用了 where条件。
注意
有两个信息是需要特别注意的
Using filesort 基于磁盘进行数据的排序,这样的性能是级差的。
Using temporary 会建立临时表来进行操作,如果执行计划还是全表扫描的话就更糟糕了,会将全表数据放到临时表进行扫描,涉及到大量的磁盘IO ,性能级差。