B-Tree索引有效和失效的情况

以索引key{last_name, first_name, dob)为例
索引有效的情况:
1.全位匹配:
全值匹配指的是和索引中的所有列进行匹配, 例如前面提到的索引可用于查找姓名为CubaAllen、出生于1960-01-01 的人。
2.匹配最左前级
前面提到的索引可用于查找所有姓为Allen 的人, 即只使用索引的第一列。
3.匹配到前级
也可以只匹配某一列的值的开头部分。 例如前面提到的索引可用于查找所有以J开头的姓的人。 这里也只使用了索引的第一列。
4.匹配范围值
例如前面提到的索引可用于查找姓在Allen 和B arrymore之间的人。 这里也只使用了索引的第一列。
5.精确匹配第一列并范围匹配另外一列
前面提到的索引也可用于查找所有姓为Allen,井且名字是字母K开头(比如Kim、 Karl等) 的人。 即第一列last_name也全匹配,第二列first_name范围匹配。
6.只访问索引的查询
B-Tree通常可以支持 “只访问索引的查询”,即查询只需要访问索引, 而无须访问 数据行。 后面我们将单独讨论这种 “覆盖索引” 的优化。
索引失效的情况:
1.如果不是按照索引的最左列开始查找, 则无站使用索引。 例如上面例子中的索引无法用于查找名字为B ill的人, 也无法查找某个特定生日的人, 因为这两列都不是最
左数据列。 类似地, 也无站查找姓氏以某个字母结尾的人。
2.不能跳过索引中的列。也就是说,前面所述的索引无法用于查找姓为Smith 并且在某个特定日期出生的人。如果不指定名( first_name),则 MySQL 只能使用索引的 第一列。
只用到第一列:
在这里插入图片描述
用到全列:
在这里插入图片描述
3.如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。例如 ’ ’
有查询 WHERE last name=‘Smith ’ AND first_name like ’ J%’ AND dob = 1976-
12- 23 ’ ,这个查询只能使用索引的前两列,因为这里like是一个范围条件(但是服务器可以把其余列用于其他目的)。如果范围查询列值的数量有限,那么可以通过使用多个等于条件来代替范围条件。
到这里读者应该可以明白,前面提到的索引列的顺序是多么的重要:这些限制都和索引 列的顺序有关。在优化性能的时候,可能需要使用相同的列但顺序不同的索引来满足不 同类型的查询需求。
4.独立的列
“独立的列” 是指索引列不能是 表达式的一部分, 也不能是函数的参数。

猜你喜欢

转载自blog.csdn.net/shidebin/article/details/84791798
今日推荐