查询语句在本质上是一种声明式的语法,具体执行方式有很多种。
const:
mysql能对查询的某部分进行优化并将其转化成一个常量(可以看show warnings 的结果)。于 primary key 或 unique key 的所有列与常数比较时,所以表最多有一个匹配行,读取1次,速度比较快。
有时通过主键列或者唯一二级索引列与常数的等值比较来定位一条记录时,速度飞快,把这种访问方法定位为const.
若主键或者唯一二级索引是多个列组成,只有索引列的每一个列都与常数进行等值比较时,这个const访问方法才有效。
对于唯一二级索引来说,在查询列为NULL值时,比如:select * from single_table where key is null ;
因为二级索引列并不限制NULL值的数量,所以上述语句可能访问到多条记录,也就是说上面这个语句不可以使用const来执行。
ref
由于普通二级索引并不限制索引列的唯一性,所以在某个扫描区间中的二级索引记录可能有多条,此时使用二级索引执行查询的代价就取决于该扫描区间中的记录条数。我们把这种“搜索条件为二级索引列的与常数进行等值比较,形成的扫描区间为单点扫描区间,采用二级索引来执行查询”的访问方法称为ref
。
ref_or_null
有时,我们不仅想找出某个二级索引列的值等于某个常数的记录,还想把该列中的值中为NULL
的记录也找出来。这种查询所使用的方法就是ref_or_null
。ref_or_null
访问方法只是比ref
访问方法多扫描了一些值为NULL
的二级索引记录。
range
“使用索引执行查询时,对应的扫描区间为若干个单点或者范围扫描区间”的访问方法称为range。
仅包含一个单点扫描区间和扫描区间为(-∞,+∞)的访问方法不能称为range。
index
在使用联合索引时,联合索引字段包含查询列表字段,并且联合索引的字段又包含搜索条件中的字段这个过程不用执行回表操作,直接扫描二级索引记录比直接扫描全部的聚簇索引的成本要小很多。这种扫描方法称为index
访问方法。(无法满足最左查询,但是SELECT的值&WHERE的值都是联合索引值,所以直接去扫描二级索引了),
All
索引合并(Mysql为多个索引形成扫描空间)
Intersection索引合并(交集 AND)
两个好处:
1.都是按照主键排序好,从多个有序集合取出交集相对方便
2. 拒绝随机IO
当一个搜索条件中涉及多个索引。Intersection索引合并指的就是从不同索引中扫描到的记录的id值取交集,只为这些id执行回表操作。
如果使用某个二级索引查询时,扫描区间的值不是用主键索引排序,则无法使用Intersection合并。
注意噢:二级索引记录是包含索引列和主键值的,索引值相同的情况下则按照主键值排序。
Union索引合并(并集 OR)
当一个搜索条件中涉及多个索引。Union索引合并指的就是从不同索引中扫描到的记录的id值取并集,根据二级索记录的id值在两者的结果中去重,根据去重后id执行回表操作。
如果使用某个二级索引查询时,扫描区间的值不是用主键索引排序,则无法使用Union合并。
Sort-Union索引合并
Sort-Union索引合并只比Union索引合并多了一步,对二级索引记录的主键值进行排序的过程。