为啥跳过列表不优先于数据库的 B+-树?

Posted

技术标签:

【中文标题】为啥跳过列表不优先于数据库的 B+-树?【英文标题】:Why are skip lists not preferred over B+-trees for databases?为什么跳过列表不优先于数据库的 B+-树? 【发布时间】:2014-03-16 17:37:41 【问题描述】:

我正在阅读有关跳过列表和 MemSQL 的内容,想知道为什么跳过列表在数据库中没有得到更广泛的使用?使用跳过列表有什么主要缺点吗?

【问题讨论】:

【参考方案1】:

数据库通常非常庞大,以至于它们必须存储在外部存储器中,例如巨大的磁盘驱动器。因此,大多数数据库应用程序的瓶颈是我们必须将内存从磁盘驱动器传输到主内存的次数。

B 树及其变体经过专门设计,可最大限度地减少执行每个操作所需的块读取和写入次数。在数学上,每个 B-tree 操作所需的内存传输次数为 O(log n / log B),其中 B 是块大小。将此与跳过列表进行比较,后者需要 O(log n) 的内存传输以符合预期。由于 B 通常以兆字节为单位,因此 log B 可以在 15 - 25 附近,因此 B-tree 可以明显更快。即使数据库位于主内存中,内存层次结构(L1 和 L2 缓存等)的影响也非常明显,以至于 B-tree 变体在实践中仍然比许多其他数据结构更快。 This Google blog post 提供了一些背景知识。

虽然 B 树上的每个操作通常比其他数据结构中的相应操作需要更多的 CPU 工作,但它们需要如此少的内存传输这一事实往往使它们在实践中比其他数据结构快得多。因此,不建议在数据库中使用跳过列表。

B 树之所以好的还有另一个原因:它们在最坏情况下是有效的。尽管确实存在确定性跳过列表,但大多数跳过列表实现都是随机的,并对其行为提供预期的保证。在数据库中,这可能是不可接受的,因为数据库上的许多用例都需要最坏情况下的高效行为。

希望这会有所帮助!

【讨论】:

一个写得很好的和有见地的答案。击中我需要知道的所有要点。谢谢! 不能跳过列表通过为每个节点打包 B 个元素来获得相同的优势吗? 这是一个有趣的观点,老实说我没有想到这一点!我想你可以这样做。让我想想……【参考方案2】:

虽然游戏已经很晚了,但我感到有一种冲动要回复它作为其最高评价的答案,并且可能没有传达完整的信息。

跳过列表不同于平衡树数据结构,因为它允许有效地组合多个列表。 在数据库方面,它允许有效地组合基于跳过列表的索引。 一个很好的例子是 Lucene,它为 Solr/ElasticSeach 等搜索引擎提供支持。 https://issues.apache.org/jira/browse/LUCENE-866.

B-Tree 在组合多个索引时存在问题,而不是先验地索引整体组合,这效率不高,因为它需要重新索引历史记录。

因此,当数据存储必须支持对数据跳过列表的任意查询时,这是一个理想的选择。

【讨论】:

很好的答案。对于像 MemSQL 这样的内存数据库,SkipLists 实际上是有意义的。

以上是关于为啥跳过列表不优先于数据库的 B+-树?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不使用指针数组来优化链表而使用跳过列表呢?

平衡二叉树与索引跳过列表

在 Python 中,为啥属性优先于实例属性?

为啥 Python for 循环在遍历列表副本并进行删除时会跳过元素? [复制]

为啥MongoDB采用B树索引,而Mysql用B+树做索引

为啥有关MongoDB采用B树索引,以及Mysql B+树做索引