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


  • 存放目录项记录的页分为不同的层次,在同一层次中的页也是根据页中目录项记录的 c2 列大小顺序排成一个双向链表 。

    1. B+ 树的叶子节点存储的并不是完整的用户记录,而只是 c2列+主键 这两个列的值 。目录项记录中不再是 主键+页号 的搭配,而变成了 c2列+页号 的搭配 。

    查询逻辑也有不同,需要先根据c2列的值,去有关c2列建的二级索引里面查所在记录的主键的值,然后再去聚簇索引查询主键所在记录,这个过程叫做回表
    # 联合索引
    我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让 B+ 树按照 c2和 c3 列的大小进行排序,这个包含两层含义:
    • 先把各个记录和页按照 c2 列进行排序 。
    • 在记录的 c2 列相同的情况下,采用 c3 列进行排序

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

    文章插图
    如图所示,我们需要注意一下几点:
    • 每条 目录项记录 都由 c2 、 c3 、 页号 这三个部分组成,各条记录先按照 c2 列的值进行排序,如果记录的 c2 列相同,则按照 c3 列的值进行排序 。
    • B+ 树叶子节点处的用户记录由 c2 、 c3 和主键 c1 列组成 。
    • 千万要注意一点,以c2和c3列的大小为排序规则建立的B+树称为联合索引,本质上也是一个二级索引 。它的意思与分别为c2和c3列分别建立索引的表述是不同的,不同点如下:
    • 建立 联合索引 只会建立如上图一样的1棵 B+ 树 。
    • 为c2和c3列分别建立索引会分别以 c2 和 c3 列的大小为排序规则建立2棵 B+ 树 。

    # MySQL中创建和删除索引的语句
    我们可以在创建表的时候指定需要建立索引的单个列或者建立联合索引的多个列:
    CREATE TALBE 表名 (各种列的信息 ··· ,[KEY|INDEX] 索引名 (需要被索引的单个列或多个列) )
    其中的 KEY 和 INDEX 是同义词,任意选用一个就可以 。我们也可以在修改表结构的时候添加索引:
    ALTER TABLE 表名 ADD [INDEX|KEY] 索引名 (需要被索引的单个列或多个列);
    也可以在修改表结构的时候删除索引:
    ALTER TABLE 表名 DROP [INDEX|KEY] 索引名;
    比方说我们想在创建 index_demo 表的时候就为 c2 和 c3 列添加一个 联合索引 ,可以这么写建表语句:
    CREATE TABLE index_demo(c1 INT,c2 INT,c3 CHAR(1),PRIMARY KEY(c1),INDEX idx_c2_c3 (c2, c3) );
    在这个建表语句中我们创建的索引名是 idx_c2_c3 ,这个名称可以随便起,不过我们还是建议以 idx_ 为前缀,后边跟着需要建立索引的列名,多个列名之间用下划线 _ 分隔开 。如果我们想删除这个索引,可以这么写:
    ALTER TABLE index_demo DROP INDEX idx_c2_c3;
    总结:就是套中套,数据页根据页目录来二分查找记录,然后再给页建个目录,好听点叫索引,这样查找的顺序就是先去装有目录项的数据页查询到哪个数据页,然后数据页中,根据页目录查询记录,注意非主键条件,存在回表操作!
    关注[ggball博客](https://ggball.top)!
    【为什么选择B+树作为索引结构 b树索引和b+树索引的区别】Tags:


    推荐阅读