十五、B+ 树索引

索引页

  现在我们知道,innodb 会把每个数据页最小主键和所在数据页组成一个主键目录,然后根据主键查找记录时,在主键目录上使用二分法即可快速查找到记录所在的数据页。可是在数据量极大的场景下,数据页数量会极大,然后主键目录也会很大,如果还是使用这种方式也是不可取的。

0

  所以实际上 innodb 会把索引也放在数据页中,这就是所谓的索引页。

0

B+ 树索引树

  跟数据页一样,把索引页中最小的主键ID和所在的索引页当作一个新的索引页,以此类推,最终形成一棵 B+ 树,然后在使用主键 ID 查找时,就可以通过 B+ 树定位到记录所在的数据页。

0

聚簇索引

  根据之前的讨论,索引页其实跟数据页一样,只不过索引页不存放真实的数据,它在整个 B+ 树中属于非叶子节点,数据页属于叶子节点,像这种索引页+数据页组成的 B+ 树就是聚簇索引,属于一级索引,并且每个表有且只有一个聚簇索引。

非聚簇索引

  与聚簇索引相对应的非聚簇索引,属于二级索引或者称为辅助索引。是由除主键外其它字段建立的索引。与聚簇索引不同的是,非聚簇索引的叶子节点并不保存完整的数据。

  如果使用非聚簇索引查询的字段是索引字段,那么查询到索引后直接返回,SQL 语句类似于 “ select name from user where name = 'zhangsan' ”,其中 “name” 字段为非聚簇索引。

  如果使用非聚簇索引查询完整的数据行,那么查询到索引后会通过索引的主键 ID 再次 “回表” 查询完整的数据。所谓的 “回表”,就是非聚簇索引查到索引后,再次通过索引的主键 ID 在聚簇索引上查找到数据所在的数据页,然后从数据页返回完整的数据。SQL 语句类似于 “ select * from user where name = 'zhangsan'

0

  非聚簇索引可以是一个字段,也可以是多个字段的组合索引。比如字段 “name” 和 “age” 可以单独建立一颗 B+ 索引树,也可以联合建立,SQL 语句为 “ create index {index_name} on {table_name} ({filed_name},...)

  然后在查询时使用单个索引查询时,比如:select * from user where name = 'zhangsan' 或者 select * from user where age = 12,都可以查询。

  在查询是使用组合索引查询时,有几个匹配规则。设定给 user 表建立联合索引 "create index user_index on user (name,age,score)" 。

  等值匹配select * from user where name = 'zhangsan' and age = 12 and score = 1 ;where 条件中的字段与索引字段完全一致,并且是等值查询,即使字段顺序不一致也可以。
  最左侧列匹配select * from user where name = 'zhangsan' ;在 where 条件中不一定全部字段都要使用,只用最左侧字段也是可以的。但是如果跳过最左侧字段就不行了, 因为索引的匹配顺序是从左到右进行的,所以在建立索引时需要考虑联合索引的字段顺序。
  最左前缀匹配select * from user where name like 'zhang%' ;索引字段在使用模糊匹配时也可以使用索引查询,但只能是右模糊匹配。
  范围匹配select * from user where name > 'zhangsan' and name < 'lisi' and age < 12 ;这时 name 字段的范围匹配也会使用索引,但是 age 字段则不会使用索引,因为最左侧字段可以直接匹配到数据所在的数据页段(数据页都是有序排列的)。
  等值匹配+范围匹配select * from user where name = 'zhangsan' and age > 2 and age < 5 ;where 条件的 name = 'zhangsan' 和紧跟着的范围查询 age > 2 会使用索引,而 age < 5 将不会使用索引。

  在查询时使用合并索引查询时,比如:select * from user where name = 'zhangsan' 或者 select * from user where age = 12  以及 select * from user where name = 'zhangsan' and age = 12 都可以查询。

  看起来,合并索引比组合索引可以适应更多的情景,但是多个索引将会占用更多的空间,且难以维护,因为增删改会调整索引的结构,这个过程是极为耗时的。

posted @   维维尼~  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示