我在B +树的基础上观看这个video,他提到B +树的叶子存储在磁盘上,除了存储在main memory
中的root
。我的班级教授提到索引存储在main memory
中,而leaves
包含指向磁盘的数据指针。B +树索引存储在哪里?
见下图:
我的问题是完全相同的所有索引存储在何处?
- 我们只在主存中存储根吗?
- 所有索引都存储在主内存中?
我已经经历了几个没有人明确提到这部分的链接?任何人都可以澄清我的问题。谢谢
我在B +树的基础上观看这个video,他提到B +树的叶子存储在磁盘上,除了存储在main memory
中的root
。我的班级教授提到索引存储在main memory
中,而leaves
包含指向磁盘的数据指针。B +树索引存储在哪里?
见下图:
我的问题是完全相同的所有索引存储在何处?
我已经经历了几个没有人明确提到这部分的链接?任何人都可以澄清我的问题。谢谢
你被告知在很多方面都是垃圾。
对于B树索引正常工作,没有预先设计的方案需要存储什么。 RDBMS可以自由决定在哪里存储哪些数据。
我知道的大多数RDBMS都统一处理所有B树页面和所有非树数据页面。有一个用于快速访问的内存缓存,但所有数据也都存储在磁盘上。没有理由区分树和非树。此外,当存储数据时,根,内页和叶页之间没有区别。
但是,这并不一定是这样,不同的选择可以被制成。
树根特别处理肯定是错误的。它需要与索引内容一样持久,因此它必须存在于磁盘上。将数据存储在内存中会在数据库关闭时丢失索引。
某些数据库系统支持在数据库启动时从持久数据重建的内存中索引。这也是一个有效的设计选择。但是这是一个的选择,它并不一定如此。
这取决于数据库服务器的详细实现。使用SQL Server(您已将其标记为服务器),根可能始终在内存中,但它也会在磁盘上 - 它必须是SQL Server可以停止并重新启动 - 并且可以重新启动实际的计算机 - 不丢失根页面。
我不相信MS会对这种东西如何实现做出任何承诺。该计划听起来很明智,但不能保证会发生什么。例如,我会想象在索引实际使用之前,根页面不会在内存中(为什么浪费了尚未被请求的资源?);一旦它被使用,它可能会被保存在内存中,但如果服务器开始内存不足,如果一段时间没有使用,它可能会被刷新到光盘。在任何情况下,根页面的任何更改都将作为需要更改的事务的一部分刷新到光盘。
您的评论是如此有帮助。关于B +树有太多的误解,我无法在任何地方找到所有的信息。谢谢 – python
如果你想了解它是如何完成的,请看SQL Server。我发现它的架构非常干净和漂亮。好的搜索条件是“sql服务器(b-tree |索引内部|缓冲池|懒惰作家)”。 – usr