const

通过主键或者唯一索引的访问,速度超高
select from table where id = x / select from table where name = “x”
直接通过聚簇索引 或者 二级索引 + 回表操作 快速定位到数据,在执行计划里称为Const - ,直接通过索引定位到数据,速度极快,性能超高,常量级。
这里有个注意点,就是二级索引必须是unique key 才会是const

ref

用了普通的索引,或者用主键/唯一索引搞了一个IS NULL/IS NOT NULL
包含多个列的普通索引的话,那么必须是从索引最左侧开始连续多个列都是等值比较才可以是 属于ref方式
用name IS NULL这种语法的话,即使name是主键或者唯一索引,还是只能 走ref方式
针对一个二级索引同时 比较一个值 还限定 IS NULL ,类似于 select from table where name = x and name is null,执行计划就叫*ref_or_null

range

SQL里有范围查询的时候就会走这个方式
select * from table where age>=x and age <=x
假设age 就是一个普通索引,此时必然利用索引来进行范围查询,一旦利用索引做了范围查询,就是range

index

KEY(x1,x2,x3)
select x1,x2,x3 from table where x2 = xxx
这个 SQL 没有办法直接利用联合索引快速查找,但是select 的字段刚好是联合索引的几个字段。
针对这种SQL,在实际查询的时候,直接遍历KEY(x1,x2,x3) 联合索引树的叶子结点的那些页,一个接一个的遍历,然 后找到 x2=xxx 的那个数据,就把里面的x1,x2,x3三个字段的值直接提取出来就可以了!这个遍历二 级索引的过程,要比遍历聚簇索引快多了,毕竟二级索引叶子节点就包含几个字段的值,比聚簇索引叶 子节点小多了,所以速度也快! —不需要回表查询了,但比全表扫描好一些
不通过索引树的根节点开始快速查找,而是直接对 二级索引的叶子节点遍历和扫描


联合索引:(x1,x3)、(x2、x4)
建立了两个联合索引,MySQL 会选择其中一个,即会选择索引里扫描行数比较少的那个条件。
比如说x1=xx,在索引里只要做等值比较,扫描数据比较少,那么可能就会挑选x1的索引,做一个索引 树的查找,在执行计划里,其实就是一个ref的方式,找到几条数据之后,接着做一个回表,回到聚簇索 引里去查出每条数据完整数据,接着加载到内存里,根据每条数据的x2字段的值,根据x2>=xx条件做 一个筛选。

select * from table where x1 = xx and c1 = xx and c2>=xx and c3 is not null
就一个x1有索引,其他字段是没有索引的。
根据x1找出数据,到内存中去过滤符合条件的数据。

一个SQL语句用到多个二级索引

select from table where x1 = xx and x2 =xx, x1和x2两个字段分别都有一 个索引,
其实也有一定的可能会让查询优化器生成一个执行计划,执行计划里,就先对x1字段的索引树 进行查找,查出一波数据,接着对x2的索引树查出一波数据,然后对两波数据,*按照主键值做一个交集。
这个交集就是符合两个条件的数据了,接着回表到聚簇索引去查完整数据就可以了。 —先求交集再回表

什么情况会用到两个索引, 比如你x1和x2两个字段,如果你先查x1字段的索引,一下子弄出来上万条 数据,这上万条数据都回表到聚簇索引查完整数据,再到内存根据x2来过滤,成本太大。

那如果说同时从x2的索引树里也查一波数据出来,做一个交集,一下子就可以让交集的数据量变成几十 条,再回表查询速度就很快了。
一般来说,查索引树速度都比较快,但是到聚簇索引回表查询会慢一 些。