explain中的列
1.id列
id列的值是select的序列号,有几个select就有几个id,id大的先执行,id相同则从上往下执行。
2.select_type列
表示对应行是简单查询还是复杂查询。
· simple:简单查询。查询不包含子查询和union。
· primary:复杂查询的最外层查询。
· subquery:不相关子查询,优化器会采用物化的方式执行。
· dependent_subquery:相关子查询。
· derived:在from子句中的子查询,把结果放在临时表里。
· union:union关键字后的select
· union_result:从union的结果集做select或者去重
· dependent_union:在union或union all的大查询中,如果各个小查询都依赖外查询,除最左边的小查询外,其他的都是dependent union。
3.table列
当前select行访问的表。
4.type列
表示关联类型或访问类型。按查询性能递减的方式列举:
· system:该表只有一行,const的特例。
· const:常数级查询,最多匹配一行。出现在基于主键或唯一键的等值查询。
· eq_ref:查询字段是主键或唯一键。最好的表连接类型。
· ref:查询字段是二级索引。
· fulltext:查询字段是全文索引。
· ref_or_null:类似于ref,但会额外增加null值的搜索查询。
· index_merge:索引合并。
· unique_subquery:in子查询中类似eq_ref。
· index_subquery:in子查询中类似ref。
· range:范围查询。
· index:类似ALL,但是是非聚簇索引的索引树。发生于索引覆盖或索引排序的全表扫描。
· all:全表扫描。
5.partitions
分区表
6.possible_kyes
可能会使用到的索引
7.key
实际使用的索引
8.key_len
索引字段的长度
9.ref
表在key列记录的索引中查找值所用的列或常量
10.rows
估算出要检索的行数,这个值偏大的话就要考虑SQL的优化了。
11.filtered
按表条件过滤的行的百分比
12.extra
· distinct:发现第一个匹配行后停止搜索。
· not_exists:左连接的优化。一旦找到匹配左连接标准的行,就停止检索。
· range_checked_for_each_record:没有找到合适的索引。
· using_filesort:MySQL有索引排序和外部排序两种排序方式,对应的外部排序。优化索引结构。
· using_temporary:用临时表保存中间结果。根据结果集大小优化,能不用就不用,能不用磁盘临
时表就不用磁盘临时表,磁盘临时表一定要用的话也可以提前指定来避免内存
临时表到磁盘临时表的判断转换。
· using_index:使用了覆盖索引。
· using_index_condition:使用了二级索引但需要回表。
· using_where:where条件的过滤。
· using_join_buffer:获取连接条件时使用了连接缓存而不是索引。优化索引结构。