Type访问类型,效率低到高如下:
all < index < range < index_subquery < unique_subquery < index_merge < ref_or_null < ref < eq_ref < const < system
1. all
全表扫描,Mysql遍历全表来找到匹配的行,在大数据量的时候效率极低。
2. index
索引全扫描。Mysql遍历整个索引来查询匹配的行。根据Extra的内容分以下几种情况:
Using Index:表示相应的select操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高。使用索引来直接获取列的数据,而不需回表。如果同时出现Using where,表明索引被用来执行索引键值的查找。 如果没用同时出现Using where,表明索引用来读取数据而非执行查找动作。Using Index就是只需使用索引就可以查到所需的字段。
覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。
注意:
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select *
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能
Using Where:使用了where筛选条件。
Using Index & Using Where:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据,即是利用索引查找键值。
Using filesort:Using filesort通常出现在order by,当试图对一个不是索引的字段进行排序时,mysql就会自动对该字段进行排序,这个过程就称为“文件排序”。
Using temporary:表示在查询过程中产生了临时表用于保存中间结果。mysql在对查询结果进行排序时会使用临时表,常见于group by。group by的实质是先排序后分组,同order by一样,group by和索引息息相关。出现Using temporary意味着产生了临时表存储中间结果并且最后删掉了该临时表,这个过程很消耗性能。
会产生临时表的情况:
不会产生临时表的情况:
Null:查询列有些不是索引,需要回表来查询未被索引覆盖的字段(不是纯粹用了索引,也不是完全没用到索引)
3. range
索引范围扫描。常见于:<、<=、>、>=、between
4. index_subquery
用于in形式子查询使用到了辅助索引或者in常数列表,子查询可能返回重复值,可以使用索引将子查询去重。
5. unique_subquery
用于where中的in形式子查询,子查询返回不重复值。
6. index_merge
使用了索引合并优化。(对多个索引分别进行了条件的查询,最后对这几个查询的结果进行合并交集运算)
7. ref_or_null
类似ref。区别是他会额外的搜索包含null的记录,他会对其进行一些优化。(例如:select * from m_user where age = 18 and name is null)
8. ref
使用非唯一索引扫描或唯一索引的前缀扫描,返回匹配某个单独值的记录。
9. eq_ref
类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配;简单来说,就是多表连接中使用primary key或者unique index作为关联条件。
10. const
查询条件是主键或者非NULL的UNIQUE索引,因此结果只有一条,同时优化过程中查询列值会转成常量。
11. system
表中数据只有一行的情况。
12. NULL
不用访问表就可以直接得到结果。(例如:SELECT 1)