innodb数据结构B+树
参考链接
- 面试官问你B树和B+树,就把这篇文章丢给他
- 什么是平衡二叉树
- Innodb使用B+索引的原因
- B树比B+树更适合索引
- mysql缓冲池和数据算法
- mysql的B+树如何存储主键和数据,磁盘io和innodb页大小的一些问题
- 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
B+树,节点数量-9,书高-4
- 该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的右子树
为什么要使用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、所有的键值分布在整棵树中
不适合范围性查找,需要做树的中序遍历,树的高度还是太高(存储了同时 存储了键和值导致的)