B +树索引存储在哪里?

时间:2015-12-11 01:38:28

标签: sql-server memory tree computer-science b-tree

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

见下图:

enter image description here

我的问题是所有索引都存储在哪里?

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

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

2 个答案:

答案 0 :(得分:3)

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

为了使B树索引正常工作,没有预先设计的方案需要存储的内容。 RDBMS可以自由决定在哪里存储什么类型的数据。

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

但这不一定是这样,可以做出不同的选择。

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

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

答案 1 :(得分:1)

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

我不相信MS对如何实现这类东西做出任何承诺。提出的方案听起来很合理但不能保证会发生什么。例如,我认为在实际使用索引之前根页不会在内存中(为什么浪费资源还没有被要求呢?);一旦它被使用它可能被保存在内存中,但如果服务器开始耗尽内存,如果一段时间不使用它可能会被刷新到光盘。在任何情况下,对根页面的任何更改都将刷新到光盘,作为需要更改的事务的一部分。