Mysql的访问类型type总结

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意味着产生了临时表存储中间结果并且最后删掉了该临时表,这个过程很消耗性能。

会产生临时表的情况:

  1. 对一个没有索引的字段进行分组,会产生临时表。
  2. 当order by子句和group by子句的字段不同时就会产生临时表。
  3. 当用left join时,若order by子句和group by子句都来自于从表时会产生临时表。

不会产生临时表的情况:

  1. 对一个有索引的字段进行分组就不会产生临时表。
  2. 当order by子句和group by子句的字段相同时不会产生临时表。

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)

你可能感兴趣的:(数据库)