点击标题下「蓝色微信名」可快速关注
技术社群的这篇文章《是什么让OLTP数据库能够如此快速地查找数据?》,是Vu Trinh写的这篇文章的译文,给我们讲解了关系型数据库B-Tree的数据结构,虽然数据库不同,但原理相通,可以学习借鉴。
原文链接,可以看下原版,
https://vutr.substack.com/p/what-makes-oltp-databases-so-quick
前言
作为一名数据工程师,我并没有花太多时间去使用像 PostgreSQL 这样的 OLTP 数据库。我知道,为了让数据库中的数据操作变快,必须有一些技术来提升数据库所支持典型工作负载的性能。对于 OLAP 系统来说,最终目标是尽可能多地剪枝数据。
对于 OLTP 系统来说,目标是尽可能快地找到一条记录。
但它们是怎么办到的呢?

在本文中,我们将深入探讨在 PostgreSQL 和 MySQL 这类数据库中,用于优化查询性能的最流行技术:B-Tree。我们首先学习内存中树数据结构的基础知识,并利用这些知识逐步建立对 B-Tree 的理解。
一、树
在计算机科学中,树用来模拟一种层次结构。数据被安排在节点中,这些节点按层次链接。以下术语定义了任何树结构:






二、二叉树











三、平衡



四、二叉树在磁盘上不能很好地工作







五、B树
鉴于大多数关系型数据库将数据存储在磁盘上,它们需要对 BST 进行改进。于是 B-Tree 出现了。


六、剖析
在经典的 B-Tree 实现中,数据可以存储在非叶子节点中。在变种 B+ Tree 中,只有叶子节点保存数据。




对于非叶子(根和内部)节点,它们存储:


数据操作归结于找到所需的数据节点。读取和更新数据是类似的过程。更详细地说,过程如下:

七、节点已满



对于叶子节点的情况,通过将此键复制到父节点,该键现在充当导航指南。父节点说:“任何小于该键的去我的左孩子,任何大于或等于该键的去我的右孩子。”
对于内部节点的情况,将此键移动到父节点充当分割。它不再需要存在于子节点级别,因为它的唯一目的是分割那些现在位于两个独立节点中的键。由于此级别没有数据指针,移动该键不会导致丢失对任何数据的访问。
如果父节点也溢出了,它们也必须被分裂。这种分裂操作可能需要递归地一直进行到根节点。
八、节点未充分利用
与溢出相反的情况,称为下溢,即一个节点包含的键数少于最小键数限制(N/2)。这可能在用户删除数据时发生。解决此情况的过程与系统解决溢出的方式正好相反。
想法很简单:如果两个相邻节点(兄弟节点)拥有同一父节点,并且它们的总键数可以放入一个节点中,它们应该被合并:


与溢出情况一样,解决下溢的过程可能需要一直进行到根节点。
九、使其可靠

结语

>>>>
参考资料
如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发朋友圈,
