MySQL BTree索引的适用场景和限制


适用场景:

  1. 全值匹配:全值匹配指的是和索引中的所有列进行匹配,即可用于查找姓名和出生日期
  2. 匹配最左前缀:如:只查找姓,即只使用索引的第一列
  3. 匹配列前缀:也可以只匹配某一列值的开头部分,如:匹配以J开头的姓的人,这里也只是使用了索引的第一列,且是第一列的一部分
  4. 匹配范围值:如查找姓在allen和barrymore之间的人,这里也只使用了索引的第一列
  5. 精确匹配某一列并范围匹配另外一列:如查找所有姓为allen,并且名字字母是K开头的,即,第一列last_name精确匹配,第二列first_name范围匹配
  6. 只访问索引的查询:btree通常可以支持只访问索引的查询,即查询只需要访问索引,而无需访问数据行,即,这个就是覆盖索引的概念。需要访问的数据直接从索引中取得。

为索引树中的节点是有序的,所以除了按值查找之外,索引还可以用于查询中的order by操作,一般来说,如果btree可以按照某种方式查找的值,那么也可以按照这种方式用于排序,所以,如果order by子句满足前面列出的几种查询类型,则这个索引也可以满足对应的排序需求。


限制:

  1. 如果不是按照索引的最左列开始查找的,则无法使用索引(注意,这里不是指的where条件的顺序,即where条件中,不管条件顺序,只要where中出现的列在多列索引中能够从最左开始连贯起来就能使用到多列索引)
  2. 不能跳过索引中的列,如:查询条件为姓和出生日期,跳过了名字列,这样,多列索引就只能使用到姓这一列
  3. 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询,如:where last_name=xxx and first_name like ‘xxx%’ and dob=’xxx’;这样,first_name列可以使用索引,这列之后的dob列无法使用索引。

猜你喜欢

转载自blog.csdn.net/sunjin9418/article/details/80333802