如今,许多(也许是最多?)数据库应用程序都使用B树和变体来存储数据,因为这种数据结构优化了硬盘上的读取,写入和查找操作(这些操作反过来在硬盘的整体效率中起着重要的作用。数据库)。
但是,固态驱动器(SSD)是否应该完全取代传统硬盘(HDD),我们是否可以说B树和变体将变得过时,从而为在直接访问内存上更有效地运行的数据结构留出空间?如果是这样,这些结构将是什么?(例如,哈希表,AVL树)
如今,许多(也许是最多?)数据库应用程序都使用B树和变体来存储数据,因为这种数据结构优化了硬盘上的读取,写入和查找操作(这些操作反过来在硬盘的整体效率中起着重要的作用。数据库)。
但是,固态驱动器(SSD)是否应该完全取代传统硬盘(HDD),我们是否可以说B树和变体将变得过时,从而为在直接访问内存上更有效地运行的数据结构留出空间?如果是这样,这些结构将是什么?(例如,哈希表,AVL树)
Answers:
B树最常用于硬盘上的数据库索引,但由于具有多层缓存和虚拟内存的现代内存分层结构,它们甚至具有内存数据结构的优点。即使虚拟内存位于SSD上,也不会改变。
我使用内存B +风格的多路树库,该库在C ++中写了很多。它可以具有性能优势-最初编写它的原因是为了尝试更好地使用缓存-但我不得不承认,这样做通常不起作用。问题在于权衡,这意味着项目必须在插入和删除的节点内移动,而对于二叉树则不会发生这种情况。此外,事实告诉我,我曾经用来优化它的一些低级编码技巧–好吧,它们可能会混淆并击败优化器。
无论如何,即使您的数据库存储在SSD上,它仍然是面向块的存储设备,并且使用B树和其他多路树仍然有优势。
但是,大约十年前,发明了不使用高速缓存的算法和数据结构。这些忽略了高速缓存等的大小和结构-它们使(渐近地)最佳地利用了任何内存层次结构。B树需要“调整”到特定的内存层次结构,以充分利用(尽管它们在相当大的变化范围内都可以很好地工作)。
缓存遗忘的数据结构,即使有的话,也很少在野外看到,但是现在它们很可能会使通常的内存中的二进制树过时了。而且它们对于硬盘和SSD也很有价值,因为它们不在乎群集大小或硬盘缓存页面大小是多少。
Van Emde Boas布局在对高速缓存不敏感的数据结构中非常重要。
MIT OpenCourseware算法课程涵盖了一些缓存遗忘数据结构。
先验的是,是的,大多数数据库引擎将必须重写,因为B树将不再是存储数据的最有效的数据结构,因为本地性在硬盘移动缓慢且获取数据的硬盘驱动器中非常重要以块为单位,这意味着对数据的任何更改都需要:
那就是10 + 3 + 3 + 10 + 3 + 3 = 34毫秒
平均而言,无论在磁盘上的位置如何,在SSD上执行相同操作仅需1ms。
而且由于哈希表要快得多,我们可以认为哈希表将是更好的替代方法。
唯一的问题是哈希表不保留顺序,因此不可能像Van Emde Boas一样查找下一个和上一个。
看到:
为什么找到下一个和上一个很重要?想象所有元素都大于x且小于z的情况,您需要在上一个和下一个之间使用索引。
好吧,唯一的问题是我们还没有找到具有顺序保留功能的哈希表。也许B树中存储桶的大小很重要,但这可以通过忽略缓存的算法来解决。
所以我想说这是一个开放式的问题。