为什么选择B+树作为索引结构 b树索引和b+树索引的区别( 二 )

目录项记录 的页,也就是页 30 中通过二分法快速定位到对应目录项,因为 12 < 20 < 209 ,所以定位到对应的记录所在的页就是 页9

  • 再到存储用户记录的 页9 中根据二分法快速定位到主键值为 20 的用户记录 。

  • 虽然说 目录项记录 中只存储主键值和对应的页号,比用户记录需要的存储空间小多了,但是不论怎么说一个页只有 16KB 大小,能存放的 目录项记录 也是有限的,那如果表中的数据太多,以至于一个数据页不足以存放所有的 目录项记录,该咋办呢?
    当然是再多整一个存储 目录项记录 的页喽~ 为了大家更好的理解新分配一个 目录项记录 页的过程,我们假设一个存储 目录项记录 的页最多只能存放4条 目录项记录 (请注意是假设哦,真实情况下可以存放好多条的),所以如果此时我们再向上图中插入一条主键值为 320 的用户记录的话,那就需要分配一个新的存储 目录项记录的页喽:
    为什么选择B+树作为索引结构 b树索引和b+树索引的区别

    文章插图
    记录的话,或者变成这种:
    为什么选择B+树作为索引结构 b树索引和b+树索引的区别

    文章插图
    注意:下一个数据页中用户记录的主键值必须大于上一个页中用户记录的主键值 。
    实际上这种树状结构的数据,或者说一种数据结构,这就是B+树
    不论是存放用户记录的数据页,还是存放目录项记录的数据页,我们都把它们存放到 B+ 树这个数据结构中了,所以我们也称这些数据页为 节点。从图中可以看出来,我们的实际用户记录其实都存放在B+树的最底层的节点上,这些节点也被称为 叶子节点 或 叶节点 ,其余用来存放 目录项 的节点称为 非叶子节点 或者 内节点 ,其中 B+ 树最上边的那个节点也称为 根节点。
    # 索引分类
    按照不同的排序规则分索引类型
    # 聚簇索引
    1. 使用记录主键值的大小进行记录和页的排序,这包括三个方面的含义:

    • 页内的记录是按照主键的大小顺序排成一个单向链表 。
    • 各个存放用户记录的页也是根据页中用户记录的主键大小顺序排成一个双向链表 。
    • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的主键大小顺序排成一个双向链表 。

    1. B+ 树的叶子节点存储的是完整的用户记录 。
      所谓完整的用户记录,就是指这个记录中存储了所有列的值(包括隐藏列) 。
      我们把具有这两种特性的 B+ 树称为 聚簇索引 ,所有完整的用户记录都存放在这个 聚簇索引 的叶子节点处 。这种 聚簇索引 并不需要我们在 MySQL 语句中显式的使用 INDEX 语句去创建(后边会介绍索引相关的语句),InnoDB 存储引擎会自动的为我们创建聚簇索引 。另外有趣的一点是,在 InnoDB 存储引擎中, 聚簇索引 就是数据的存储方式(所有的用户记录都存储在了 叶子节点 ),也就是所谓的索引即数据,数据即索引 。

    # 二级索引
    比方说我们用 c2 列(非主键列)的大小作为数据页、页中记录的排序规则,再建一棵 B+ 树 。
    这个 B+ 树与上边介绍的聚簇索引有几处不同:
    1. 使用记录 c2 列的大小进行记录和页的排序,这包括三个方面的含义: