谈一谈对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+树索引

 

参考:

https://time.geekbang.org/column/article/488658

posted on 2022-07-05 20:08  心海湖一霸  阅读(123)  评论(0编辑  收藏  举报