为什么选择B+树作为索引结构 b树索引和b+树索引的区别( 三 )
- B+ 树的叶子节点存储的并不是完整的用户记录,而只是 c2列+主键 这两个列的值 。目录项记录中不再是 主键+页号 的搭配,而变成了 c2列+页号 的搭配 。
查询逻辑也有不同,需要先根据c2列的值,去有关c2列建的二级索引里面查所在记录的主键的值,然后再去聚簇索引查询主键所在记录,这个过程叫做
回表# 联合索引
我们也可以同时以多个列的大小作为排序规则,也就是同时为多个列建立索引,比方说我们想让 B+ 树按照 c2和 c3 列的大小进行排序,这个包含两层含义:
- 先把各个记录和页按照 c2 列进行排序 。
- 在记录的 c2 列相同的情况下,采用 c3 列进行排序

文章插图
如图所示,我们需要注意一下几点:
- 每条 目录项记录 都由 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:
推荐阅读
- 中国第一刑侦案件白宝山 为什么白宝山是中国刑侦一号案
- 二阶连续偏导数为什么混合偏导相等 二阶混合偏导数相等的条件证明
- 冬天吃什么水果好—如何选择适合冬天吃的水果
- 叶澜依|《甄嬛传》里,为什么驯马女出身的叶澜依,有胆量见谁怼谁?
- 为什么说史前的生物大辐射惠及了所有生命?
- 青蛙为什么只吃活物?
- 为什么F1赛车手上车前要先摘下方向盘?
- 为什么我们被称为华夏儿女
- 燃气热水器怎么选? 如何选择燃气热水器
- 烟灰缸里为什么不能倒水?是什么寓意?
