聊聊B+树

361 阅读2分钟

1. B+树是什么

B+树其实是从树这个数据结构演变过来的,最初由树演变二叉树、平衡二叉树、B树(B-树),进而演变成B+树,后面又有人进行演变,现在有B*树。这个树的演变是为了磁盘或其他存储设备而设计的一个多叉树,主要是为了降低磁盘的io。

2. 为什么B+更适合作为数据库索引的存储

B+树非叶子节点值存了索引 没有存取相关的数据,因此非叶子节点更小。那么同一内部节点的索引存放在同一盘块中,那么一次性读入内存索引就越多,相对io读的次数就降低了

3. B+树的搜索过程

假设有employee这个表结构

CREATE TABLE `employee` (
  `id` int(11) NOT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into employee values(100, 43);
insert into employee values(200, 48);
insert into employee values(300, 36);
insert into employee values(400, 32);
insert into employee values(500, 37);
insert into employee values(600, 49);
insert into employee values(700, 28);

select * from Temployee where age=32; 是什么样子的

  1. 先画出idx_age索引的索引结构图,大概如下:

image.png

2,再画出id主键索引,我们先画出聚族索引结构图,如下:

image.png

因此,这条 SQL 查询语句执行大概流程就是这样:
搜索idx_age索引树,将磁盘块1加载到内存,由于32<37,搜索左路分支,到磁盘寻址磁盘块2。
将磁盘块2加载到内存中,在内存继续遍历,找到age=32的记录,取得id = 400.
拿到id=400后,回到id主键索引树。
搜索id主键索引树,将磁盘块1加载内存,在内存遍历,找到了400,但是B+树索引非叶子节点是不保存数据的。索引会继续搜索400的右分支,到磁盘寻址磁盘块3.
将磁盘块3加载内存,在内存遍历,找到id=400的记录,拿到R4这一行的数据,好的,大功告成。
因此,这个SQL查询,执行了几次树的搜索操作,是不是一步了然了呀。特别的,在idx_age二级索引树找到主键id后,回到id主键索引搜索的过程,就称为回表。

参考:juejin.cn/post/692378…