2015-12-11 52 views
1

我在B +树的基础上观看这个video,他提到B +树的叶子存储在磁盘上,除了存储在main memory中的root。我的班级教授提到索引存储在main memory中,而leaves包含指向磁盘的数据指针。B +树索引存储在哪里?

见下图:

enter image description here

我的问题是完全相同的所有索引存储在何处?

  • 我们只在主存中存储根吗?
  • 所有索引都存储在主内存中?

我已经经历了几个没有人明确提到这部分的链接?任何人都可以澄清我的问题。谢谢

回答

1

你被告知在很多方面都是垃圾。

对于B树索引正常工作,没有预先设计的方案需要存储什么。 RDBMS可以自由决定在哪里存储哪些数据。

我知道的大多数RDBMS都统一处理所有B树页面和所有非树数据页面。有一个用于快速访问的内存缓存,但所有数据也都存储在磁盘上。没有理由区分树和非树。此外,当存储数据时,根,内页和叶页之间没有区别。

但是,这并不一定是这样,不同的选择可以被制成。

树根特别处理肯定是错误的。它需要与索引内容一样持久,因此它必须存在于磁盘上。将数据存储在内存中会在数据库关闭时丢失索引。

某些数据库系统支持在数据库启动时从持久数据重建的内存中索引。这也是一个有效的设计选择。但是这是一个的选择,它并不一定如此。

+0

您的评论是如此有帮助。关于B +树有太多的误解,我无法在任何地方找到所有的信息。谢谢 – python

+0

如果你想了解它是如何完成的,请看SQL Server。我发现它的架构非常干净和漂亮。好的搜索条件是“sql服务器(b-tree |索引内部|缓冲池|懒惰作家)”。 – usr

1

这取决于数据库服务器的详细实现。使用SQL Server(您已将其标记为服务器),根可能始终在内存中,但它也会在磁盘上 - 它必须是SQL Server可以停止并重新启动 - 并且可以重新启动实际的计算机 - 不丢失根页面。

我不相信MS会对这种东西如何实现做出任何承诺。该计划听起来很明智,但不能保证会发生什么。例如,我会想象在索引实际使用之前,根页面不会在内存中(为什么浪费了尚未被请求的资源?);一旦它被使用,它可能会被保存在内存中,但如果服务器开始内存不足,如果一段时间没有使用,它可能会被刷新到光盘。在任何情况下,根页面的任何更改都将作为需要更改的事务的一部分刷新到光盘。