MySql 索引的使用

索引优先级

执行explain + sql 语句 可以查看是否使用索引

type 类型常见的几种,效率从左至右越来越好,具体情况需要根据使用情况判断
All,index,range,ref,eq_ref,const

ALL

select * from vin_record where vin_dis = '34'

由于vin_dis 没有使用索引,所以此条查询语句会进行全表扫描,效率非常低

INDEX

select vin_or from vin_record

index 只扫描索引树,效率高于all。

RANGE ###

explain select * from vin_record where id>101

range 表示范围之类的条件,常见于 '<', '<=', '>', '>=', 'between','and','in',or 等操作符。因为右范围的查找所以一般优于index

REF

explain select * from vin_record where vin_or='101'

查找条件列使用了索引而且不为主键和unique。其实,意思就是虽然使用了索引,但该索引列的值并不唯一,有重复。这样即使使用索引快速查找
到了第一条数据,仍然不能停止,要进行目标值附近的小范围扫描。但它的好处是它并不需要扫全表,因为索引是有序的,即便有重复值,也是在
一个非常小的范围内扫描。

eq_ref

类似ref, 区别就在使用的索引是唯一索引。 在联表查询中使用 primary key 或者 unique key 作为关联条件。ref_eq 与 ref相比牛的地方是,
它知道这种类型的查找结果集只有一个?什么情况下结果集只有一个呢!那便是使用了主键或者唯一性索引进行查找的情况,比如根据学号查找某一
学校的一名同学,在没有查找前我们就知道结果一定只有一个,所以当我们首次查找到这个学号,便立即停止了查询。这种连接类型每次都进行着精
确查询,无需过多的扫描,因此查找效率更高,当然列的唯一性是需要根据实际情况决定的。
eq_ref 一般出现于联表查询

CONST

explain select * from vin_rocord WHERE id=1;

如将主键或unique字段置于 where 列表中, MySQL 就能将该查询转换为一个常量。查询效率非常高

posted @ 2022-06-06 12:35  timescodes  阅读(187)  评论(0)    收藏  举报