谈一谈对B+树的理解?
为了让二叉查找树支持按照区间来查找数据,可以把索引放在树的节点上,数据放在叶子节点上。索引节点不存储数据,叶子节点串在一条链表上,链表中的数据从小到大有序。
--1、如何降低大量数据索引对内存的占用?
索引数量过多会占用大量内存, 1亿个节点(16bit) 需要大约1GB的内存。通过借助时间换空间的思路,把根节点存储在内存中,索引存储在硬盘中。
--2、如何提高从硬盘中读取数据的速度?
每个节点的读取都对应一次磁盘IO操作,树的高度就等于每次查询时磁盘IO的次数,因此要尽量降低树的高度。
--3、如何降低树的高度?高度降低为多少比较合理?
把索引构建为m叉树可以降低树的高度。在选择m大小的时候,尽量让每个节点的大小等于一个操作系统页的大小(一页大小通常为4KB,如果超过一页的大小,也会触发多次磁盘IO)
--4、索引可以提高数据库的查询效率,但为什么会降低写入和删除效率?
数据写入和删除会涉及索引的更新,会导致写入变慢。
插入和删除操作,m叉树某些节点的数量会超过或小于m,需要维护m叉树节点数量保持为m
-
根节点的子节点个数可以少于m/2
-
其余节点中子节点的个数不能超过m(通过分裂维护),也不能少于m/2(通过合并维护)
B+树中串联叶子节点的链表,使用单链表还是双链表?
根据区间值来查找数据时,数据库底层有如下实现:
-
保证查出来的数据就是用户想要的顺序
-
不保证查出来的数据的有序性,查出来之后再排序
从节约时间考虑,第一种肯定好点。那如何能保证查询出来的数据就是有序的呢?双向链表支持前后遍历,相对于单链表排序效率更高
B树、B-树、B+树有什么区别和联系?
B树和B-树的英文都是Balance Tree, 是同一个数据结构, 而B+树是B树的升级版:
-
B+树中的节点不存储数据,只是索引,而B树中的节点存储数据
-
B树中的叶子节点并不需要链表来串联
也就是说,B树只是一个每个节点的子节点个数不能小于m/2的m叉树
PostgreSQL B+树索引
参考: