随着固态硬盘的问世,B树和其他数据结构会过时吗?


15

如今,许多(也许是最多?)数据库应用程序都使用B树和变体来存储数据,因为这种数据结构优化了硬盘上的读取,写入和查找操作(这些操作反过来在硬盘的整体效率中起着重要的作用。数据库)。

但是,固态驱动器(SSD)是否应该完全取代传统硬盘(HDD),我们是否可以说B树和变体将变得过时,从而为在直接访问内存上更有效地运行的数据结构留出空间?如果是这样,这些结构将是什么?(例如,哈希表,AVL树)


您是要从数据库实现的角度来看它们是否过时,还是总的来说是因为数据库应用程序之外还有许多其他应用程序。
佩达达斯(Pemdas)2011年

从数据库的角度来看。
Daniel Scocco

Answers:


21

B树最常用于硬盘上的数据库索引,但由于具有多层缓存和虚拟内存的现代内存分层结构,它们甚至具有内存数据结构的优点。即使虚拟内存位于SSD上,也不会改变。

我使用内存B +风格的多路树库,该库在C ++中写了很多。它可以具有性能优势-最初编写它的原因是为了尝试更好地使用缓存-但我不得不承认,这样做通常不起作用。问题在于权衡,这意味着项目必须在插入和删除的节点内移动,而对于二叉树则不会发生这种情况。此外,事实告诉我,我曾经用来优化它的一些低级编码技巧–好吧,它们可能会混淆并击败优化器。

无论如何,即使您的数据库存储在SSD上,它仍然是面向块的存储设备,并且使用B树和其他多路树仍然有优势。

但是,大约十年前,发明了不使用高速缓存的算法和数据结构。这些忽略了高速缓存等的大小和结构-它们使(渐近地)最佳地利用了任何内存层次结构。B树需要“调整”到特定的内存层次结构,以充分利用(尽管它们在相当大的变化范围内都可以很好地工作)。

缓存遗忘的数据结构,即使有的话,也很少在野外看到,但是现在它们很可能会使通常的内存中的二进制树过时了。而且它们对于硬盘和SSD也很有价值,因为它们不在乎群集大小或硬盘缓存页面大小是多少。

Van Emde Boas布局在对高速缓存不敏感的数据结构中非常重要。

MIT OpenCourseware算法课程涵盖了一些缓存遗忘数据结构。


1
有趣。您提供了一些很好的指导(不要双关语!)来进一步探讨该主题。谢谢。
丹尼尔·斯科克

该MIT课程还提供有关缓存遗忘数据结构的信息。
dan_waterworth

嗨,您的意思是说B树将由于缓存不了解的数据结构而不是SSD来淘汰了吗?但是其他数据结构如何,例如DBMS中的块管理呢?
杨波

@ user955091-我的意思是因为忽略了缓存的数据结构(在学上意味着在忽略缓存的模型中是最佳的结构),但是那时我对此有些过分兴奋。其他数据结构不会很快消失。一方面,缓存不是唯一的性能问题-并行性提出了不同的要求。此外,需要基于密钥的排序通常是一种特殊情况-通常,哈希表为王。很难将“随机化”布局视为对缓存友好的,但是很难直接访问直接获取项目的访问权限-您不需要位置。
Steve314 2014年

3

先验的是,是的,大多数数据库引擎将必须重写,因为B树将不再是存储数据的最有效的数据结构,因为本地性在硬盘移动缓慢且获取数据的硬盘驱动器中非常重要以块为单位,这意味着对数据的任何更改都需要:

  1. 将磁头移动到磁盘上的正确位置(约10毫秒)。
  2. 等待磁盘旋转(以10k rpm的速度,这意味着每秒167转,但平均而言,我们只等待半转,所以〜3ms)。
  3. 读取该块(〜3ms)。
  4. 在RAM中修改。(〜10ns)
  5. 再次将磁头移动到磁盘上的正确位置(再次〜10ms)。
  6. 等待磁盘再次旋转(再次〜3ms)。
  7. 写块(〜3ms)。

那就是10 + 3 + 3 + 10 + 3 + 3 = 34毫秒

平均而言,无论在磁盘上的位置如何,在SSD上执行相同操作仅需1ms。

而且由于哈希表要快得多,我们可以认为哈希表将是更好的替代方法。

唯一的问题是哈希表不保留顺序,因此不可能像Van Emde Boas一样查找下一个和上一个。

看到:

  1. http://en.wikipedia.org/wiki/Van_Emde_Boas_tree
  2. http://bryanpendleton.blogspot.com/2009/06/cache-oblivious-data-structures.html

为什么找到下一个和上一个很重要?想象所有元素都大于x且小于z的情况,您需要在上一个和下一个之间使用索引。

好吧,唯一的问题是我们还没有找到具有顺序保留功能的哈希表。也许B树中存储桶的大小很重要,但这可以通过忽略缓存的算法来解决。

所以我想说这是一个开放式的问题。


哈希表(通常)是缓存遗忘的WRT,对其性能进行建模,但这并不意味着它在该模型中是有效的。问题在于散列函数通常设计为“随机”散布项目,这就是为什么散列表是无序的,也是散列的局部性较差的原因。这意味着,即使您可以识别带有相邻键的项目序列,也不太可能受益于每个块读取两个或更多项目(SSD仍然是块设备)。
Steve314

1
当然,哈希有时也称为“密钥转换”,并且该转换不必一定是“随机的”-也许可以定义一个允许相当有效的顺序访问的哈希函数(而不是消除搜索-信息丢失)。毕竟是散列函数-但要使其最小化),并且在保持散列冲突罕见的同时提供一些局部性的好处。
Steve314
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.