innodb数据结构B+树

452 阅读6分钟

innodb数据结构B+树

参考链接

innodb的页大小,执行 64,32,16(默认),8,4

show variables like  "%innodb_page_size%";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+


-- 查看索引是否使用的合理。
show index from {table_name}

什么是B+树

特征

  • 根节点至少有个一个节点
  • 非根节点的【元素】取值范围 m/2 <= k <=m-1 (其中m是阶)
  • 叶子节点是一个有序的双向链表,有助于范围查询,包含了树中的全部元素信息,
  • B+树中有 两中类型节点,内部节点(索引节点)和叶子节点,内部节只存索引和指针,叶子节点只存放的是数据,
  • 关键字的左子树 都 【小于】关键字,关键字的右子树都 【大于等于】 关键字
  • 每一次的数据查询都必须到叶子节点,则查询比较稳定
  • 索引节点可重复出现
  • B+树的每个节点就是 一个Page(默认16k)
  • 树每一个节点占用磁盘块(非叶子节点存储都是索引,而b树中存储的是键和值,这就意味着B+树的非节点能够存储能到的索引结点)

优点

1、非叶子节点存储的都是索引(树中每个节点可以理解为每个都是一个 磁盘块,一个节点B+树能够存储更多的关键字),降低树的高度,减少了磁盘IO次数更少。

2、所有的查询都要查询到叶子节点,查询比较稳定,(稳定为树的高度)

3、所有叶子节点是有序链表,便于范围查询(B树需要中序遍历,才可以做范围查询)

劣势

B+数是以空间换时间,父节点元素在子节点重复出现,增加了少量的空间,换来的是,范围查询的遍历。

相关计算

  • 计算2层B+树能够存储的数据是多少个?

innodb的 默认的page=16kb

B+树的非叶子节点存储的是 关键字(索引)和指针,

假设,id的类型是 bigint占用8个字节,源码中指针占用6个字节,共14字节。

1page存放指针的个数= 16384(16kb) / (8+6) = 1170(个数)

1个page能够存储记录数

单条行记录数大约为1k,则一个page能够存储的记录行数为 1个page能够存储记录数= 16/1=16

2层高的B+数能够存储的记录行数 = 1170 * 16 = 18720

3层高的B+数能够存储的记录行数 = 1170 * 1170 * 16=2190w

Q&A

  • B+树的每个节点是什么,page(innodb的page) 还是 磁盘的page

B+树的 page默认16kb

主存和磁盘之间的数据交换不是以字节为单位的,而是以n个扇区为单位的(一个扇区有512字节),通常是4kb(8个扇区),16,32,64kb为单位。

磁盘中的一页数据(4kb)和数据库innodb规定的一页数据(16kb),这两个的概念是不一样的。磁盘io的大小也是根据指令来规定的。对应数据库读写来说,

会按照数据库的配置,每次最少读写一页数据,也就是16kb

  • 为什么说B+树的,查询稳定(每次查询都要查询叶子节点)是优点呢?

非叶子节点都用来存储索引来,有效可用的存储信息就多了,降低树的高度,减少IO次数,但是带来的是,需要将 数据存放在叶子节,所以这个其实一个 隐含的一个优点。

  • B+数的非叶子节点存储都是 索引,能够降低树的高度理解?

B-树在一个,page中即存储 key+data,如果data很大,就意味着,该磁盘块存储的 查找可用信息就少了

B+树在一个,非叶子点中,只存储 key,就意味着,该page存储的 查找可用信息就很多。

这样的B+树的数据查询高度就降下了。

所以在说B+树能够使 树的高度变低,其实也要想到。每个一个节点都是一个page,

下面的图是,但从存储key来说,

B-树,节点数量-11,树高-3

image.png

B+树,节点数量-9,书高-4

image.png

  • 该B+树是 3阶 当插入节点 1,2,3时候,为什么,2的右子树是 [2,3]呢?

根据B+树的定义可知,

首先它是一个 3阶的则

1、根节点至少有个一个节点, 非根节点 m/2<=k <=m-1

2、B+树的 叶子节点是一个 有序的链表

当节点数大于 m-1时候,产生页分裂,

在 保证 叶子节点是 该树中的 全部数据有序链表

key左边小于 它,key右边都大于等于它 的情况下,则 [2,3]必须是 2的右子树

image.png

image.png

为什么要使用B+树

二叉查找树(二叉排序树)

节点左子树上的所有值,都小于父节点,节点右子树上的所有值,都大于父节点。查询时间取决于的树的高度,O(lgn),

该树也有可能长歪了(全部在单侧),变得不平衡了 退化为链表,此时的 时间复杂度O(n)

不平衡 则引入 平衡树

平衡二叉树

在avl树中,任意节点对应的两课子树的,最大高度差为1,因此它也被称为高度平衡树。插入和删除在平均和最坏的情况下都是O(lgn),

它在插入和删除的时候,都可能发生旋转。

平衡因子:【节点左子树的高度】- 【节点右子树的高度】值为【-1,0,1】则为表示为平衡,除此之外,就认为该节点失衡了,需要通过旋转来保持平衡了。

平衡二叉树的选择分类:【左旋转】【右旋转】【左右旋转】【右左旋转】

在插入和删除时,需要额外的时间来,通过旋转来调整平衡。使得插入和删除的性能下降。

红黑树(树高)

B树

是为磁盘等辅助设备设计的多路平衡查找树,当节点数量相等时,B树的【高度】要比 平衡二叉树和红黑树要低,磁盘io次数大大减少。

使用不完全填充的块来加速插入和删除

  • 定义

1、所有的叶子节点都在同一层,

2、每个节点最多有 m个子节点

3、根节点元素取值范围 1<= k <=m-1

4、非根节点元素取值范围 m/2<= k <=m-1

5、每个节点最多有 m个节点

6、所有的键值分布在整棵树中

不适合范围性查找,需要做树的中序遍历,树的高度还是太高(存储了同时 存储了键和值导致的)