009 MySQL中B+Tree对索引列是顺序存储的,适合查找范围数据,匹配原则

学软件技术,读第一手资料,去官方网站:MySQL 5.7参考手册

也可以看看比较经典的书籍,如《高性能MySQL》等


1、索引列是多个列,这种索引是如何组织数据的存储的

CREATE TABLE People(
    last_name  varchar(50)   not null,
    first_name varchar(50)   not null,
    dob        date          not null,
    gender     enum('m','f') not null,
    key(last_name,first_name,dob)
);

在MySQL中建立上面一张表,索引中包含了last_name、first_name和dob列的值,下图显示了该索引是如何组织数据的存储的。


请注意,索引对多个值进行排序的依据是CREATE TABLE语句中定义索引时列的顺序。看一下最后两个条目,两个人的姓和名都一样,则根据他们的出生日期来排列顺序。

可以使用B-Tree索引的查询类型。B-Tree 索引适用于全键值、键值范围或键前缀查找。其中键前缀查找只适用于根据最左前缀的查找。

2、索引列是多个列,按照顺序存储,对如下类型的查询有效


2.1 全值匹配

全值匹配指的是和索引中的所有列进行匹配,例如前面提到的索引可用于查找姓名为Cuba Allen、出生于1960-01-01的人。


2.2 匹配最左前缀

前面提到的索引可用于查找所有姓(last_name)为Allen的人,即只使用索引的第一列。


2.3 匹配列前缀

也可以只匹配某一列的值的开头部分。例如前面提到的索引可用于查找所有以J开头的姓的人。这里也只使用了索引的第一列。


2.4 匹配范围值

例如前面提到的索引可用于查找姓在Allen和Barrymore之间的人。这里也只使用了索引的第一一列。


2.5 精确匹配某一列并范围匹配另外一列

前面提到的索引也可用于查找所有姓为Allen,并且名字是字母K开头(比如Kim.Karl等)的人。即第一列last_name 全匹配,第二列first_ name 范围匹配。


2.6 只访问索引的查询

B-Tree通常可以支持“只访问索引的查询”,即查询只需要访问索引,而无须访问数据行。后面我们将单独讨论这种“覆盖索引”的优化。


2.7 ORDER BY 操作

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

3、索引列是多个列,按照顺序存储,对如下类型的查询无效

3.1 如果不是按照索引的最左列开始查找,则无法使用索引。

例如上面例子中的索引无法用于查找名字(first_name)为Bill的人,也无法查找某个特定生日的人,因为这两列都不是最左数据列。类似地,也无法查找姓氏以某个字母结尾的人。

3.2 不能跳过索引中的列。

也就是说,前面所述的索引无法用于查找姓为Smith并且在某个特定日期出生的人。如果不指定名(first_ name), 则MySQL只能使用索引的第一列。


3.3 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。

例如有查询WHERE last_ name= ' Smith' AND first name LIKE 'J%' AND dob = '1976-12-23',这个查询只能使用索引的前两列,因为这里LIKE是-一个范围条件(但是服务器可以把其余列用于其他目的)。如果范围查询列值的数量有限,那么可以通过使用多个等于条件来代替范围条件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值