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:表示查询的列全在索引中,且where筛选条件符合索引的前导列原则,即使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高。使用索引来直接获取列的数据,而不需回表。如果同时出现Using where,表明索引被用来执行索引键值的查找。 如果没有同时出现Using where,表明索引用来读取数据而非执行查找动作。Using Index就是只需使用索引就可以查到所需的字段。
覆盖索引(Covering Index):也叫索引覆盖。就是select列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。 
注意: 
a、如需使用覆盖索引,select列表中的字段只取出需要的列,不要使用select * 
b、如果将所有字段都建索引会导致索引文件过大,反而降低crud性能
Using Where:使用了where筛选条件。
Using Index & Using Where:a、查询的列被索引覆盖,并且where筛选条件是索引列之一但不是索引的前导列,Extra中为Using where; Using index,意味着无法直接通过索引查找来查询到符合条件的数据。b、查询的列被索引覆盖,并且where筛选条件是索引列前导列的一个范围,同样意味着无法直接通过索引查找查询到符合条件的数据。
Using filesort:Using filesort通常出现在order by,当试图对一个不是索引的字段进行排序时,mysql就会自动对该字段进行排序,这个过程就称为“文件排序”。
Using temporary:表示在查询过程中产生了临时表用于保存中间结果。mysql在对查询结果进行排序时会使用临时表,常见于group by。group by的实质是先排序后分组,同order by一样,group by和索引息息相关。出现Using temporary意味着产生了临时表存储中间结果并且最后删掉了该临时表,这个过程很消耗性能。
会产生临时表的情况:
a、对一个没有索引的字段进行分组,会产生临时表。
b、当order by子句和group by子句的字段不同时就会产生临时表。
c、当用left join时,若order by子句和group by子句都来自于从表时会产生临时表。
不会产生临时表的情况:
a、对一个有索引的字段进行分组就不会产生临时表。
b、当order by子句和group by子句的字段相同时不会产生临时表。
Null:查询列有些没有创建索引,需要回表来查询未被索引覆盖的字段(不是纯粹用了索引,也不是完全没用到索引)
3. range

索引范围扫描。常见于:<、<=、>、>=、between

4. index_subquery

利用索引关联子查询,不再全表扫描子查询中的表。常见于in形式子查询或者in常数列表。例如:
select * from t1 where context in (select context from t2)
t2的context字段建立索引

5. unique_subquery

类似于index_subquery,只是索引用到的是唯一索引。

6.index_merge

在查询过程中需要多个索引组合使用,通常出现在有or的关键字的sql中。(对多个索引分别进行了条件的查询,最后对这几个查询的结果进行合并交集运算)

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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上善亦若水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值