使用explain可以查看sql语句的执行计划,查看是否触发索引,有助于我们优化SQL语句和索引。
使用explain解析一条sql语句会出现以下几个属性:
接下来我们逐一解释这些属性的意义。
id
id代表SQL语句的执行顺序。id越大,优先级越高,越先被执行。id也可以相同,此时执行顺序由上至下。
select_type
select_type表示查询类型。包括如下几个值:
- SIMPLE:表示简单查询,不包含union和子查询。
- PRIMARY:表示主查询,查询语句中如果包含子查询,其最外层查询为主查询。
- SUBQUERY:表示select子句或where子句中的子查询。
- DERIVED:表示from子句中的子查询。
- UNION:union语句后的select语句被标记为UNION。
- UNION RESULT:从union获取结果的select。
table
表示数据来源的表。
partitions
表示匹配的分区。
type
表示访问类型。包括如下几个值:
- system:表只有一行记录,const类型的特例。
- const:使用到了primary key或unique索引,只匹配到了一行数据,速度很快。
- eq_ref:除以上两个类型外的最好联接类型,表示联表查询时,按联表的主键或唯一键联合查询。
- ref:表示非唯一性扫描,即没有使用primary key或unique索引,可能会找到多个符合条件的行。
- ref_or_null:类似ref,但可以搜索值为null的行。
- index_merge:使用了索引合并的优化方法,索引合并是指对多个索引分别进行条件扫描,然后将它们各自的结果合并。
- range:表示有范围的索引扫描,一般是where子句中出现between、<、>、in等关键字。
- index:与all一样都是读全表,但index是从索引中读取,all是从硬盘中读取,通常比all快,因为索引文件比数据文件小。
- all:全表扫描。
possible_keys
此次查询可能涉及到的索引。
key
实际使用到的索引。
key_len
索引使用的字节数。
ref
显示索引的哪一列被使用。
rows
执行查询读取的行数,数值越大表示查询效率越差。
filtered
查询的表行占表的百分比。
Extra
包含不适合在其它列显示但十分重要的信息。包含以下几个值:
- Using filesort:表示MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序操作称为“文件排序”。
- Using temporary:表示使用了临时表存储中间结果,常见于order by和group by子句。
- Using index:表示select子句中使用了覆盖索引。
- Using where:表示使用了where条件。
- Using join buffer:表示使用了连接缓存。
- impossible where:表示where子句的值总是false。
- distinct:表示发现第一个匹配行后不再继续搜索。