MySQL基础 - 单表访问方法

查询语句在本质上是一种声明式的语法,具体执行方式有很多种。

system > const > eq_ref > ref > range > index > ALL

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_nullref_or_null访问方法只是比ref访问方法多扫描了一些值为NULL的二级索引记录。

 

range

  范围扫描通常出现在 in(), between ,> ,<, >= 等操作中。使用一个索引来检索给定范围的行。

  “使用索引执行查询时,对应的扫描区间为若干个单点或者范围扫描区间”的访问方法称为range。

  仅包含一个单点扫描区间和扫描区间为(-∞,+∞)的访问方法不能称为range。

 

index

  在使用联合索引时,联合索引字段包含查询列表字段,并且联合索引的字段又包含搜索条件中的字段这个过程不用执行回表操作,直接扫描二级索引记录比直接扫描全部的聚簇索引的成本要小很多。这种扫描方法称为index访问方法。(无法满足最左查询,但是SELECT的值&WHERE的值都是联合索引值,所以直接去扫描二级索引了)

  扫描全索引就能拿到结果,一般是扫描某个二级索引,这种扫描不会从索引树根节点开始快速查找,而是直接对二级索引的叶子节点遍历和扫描,速度还是比较慢的,这种查询一般为使用覆盖索引,二级索引一般比较小,所以这种通常比ALL快一些。
 

All

  即全表扫描,扫描你的聚簇索引的所有叶子节点。通常情况下这需要增加索引来进行优化了。

 

 

索引合并(Mysql为多个索引形成扫描空间)

Intersection索引合并(交集 AND)  

  两个好处:

    1.都是按照主键排序好,从多个有序集合取出交集相对方便 

    2. 拒绝随机IO

  当一个搜索条件中涉及多个索引。Intersection索引合并指的就是从不同索引中扫描到的记录的id值取交集,只为这些id执行回表操作。

  如果使用某个二级索引查询时,扫描区间的值不是用主键索引排序,则无法使用Intersection合并。

  注意噢:二级索引记录是包含索引列和主键值的,索引值相同的情况下则按照主键值排序。

 

Union索引合并(并集 OR)

  当一个搜索条件中涉及多个索引。Union索引合并指的就是从不同索引中扫描到的记录的id值取并集,根据二级索记录的id值在两者的结果中去重,根据去重后id执行回表操作。

  如果使用某个二级索引查询时,扫描区间的值不是用主键索引排序,则无法使用Union合并。

 

Sort-Union索引合并  

  Sort-Union索引合并只比Union索引合并多了一步,对二级索引记录的主键值进行排序的过程。

 

posted @ 2021-07-31 23:06  year12  阅读(111)  评论(0编辑  收藏  举报