page contents

联合索引name_add_index(name,address)长啥样?怎么查找数据?

Pack 发布于 2020-02-08 18:03
阅读 423
收藏 0
分类:数据库

比如一个表user,我建了个索引name_add_index(name,address),那执行sql:select * from user where name=‘zs’ and address=‘changsha’,这个时候引擎的联合索引是怎么工作的。另外课上青山大大说name_add_index(name,address)相当于建了三个索引,name,addess,name_add_index,单索引好理解,一个索引一颗b+树,那name_add_index的索引树长啥样?我写的sql在引擎层咋执行的。

281
Pack
Pack

联合索引只是 b+ 树上节点的key值是由 name,address共同组成而已。
和单个字段的 b+ 树一样,插入数据时需要根据 key 值大小进行排序,将新节点放置到合适位置。
联合索引此时的排序是 由 name,address 来共同决定,先排序name,后排序addrss.

最左匹配原则
显然,根据(name,address)排序,优先排序name,也就是说,
name1 > name2 ,则 (name1,任意address)> (name2,任意address) ,这等价于 name 上建立了索引。

而联合索引的情况下,若单独对address作为查询条件进行搜索索引是不生效的,这也是因为索引树基于(name,address)排序 ,在name未知的情况下是无法进行排序的。
因为
adress1 > address2 不能推导出 (任意name,address1)> (任意name,address2)
反例如下
若 adress1 > address2,name1 > name2,此时 (name1,address2)> (name2,address1).
而显然只有当name固定时,才能对address进行排序处理,这也是为什么 一旦 name出现范围查找,则只能使用到部分索引,(name,address)中 支持对name进行排序范围查找的,但此时因为name无法确定因此无法对address进行排序.

请先 登录 后评论