B+树索引到底存放在哪里?
Where the B+ tree indexes are stored exaclty?
我在看这个video关于B+树的基础知识,他提到B+树的叶子存储在磁盘上,除了root
存储在main memory
中。我在 class 的教授提到索引存储在 main memory
中,而 leaves
包含指向磁盘的数据指针。
见下图:
我的问题是所有索引到底存储在哪里?
- 我们是否只将根存储在主内存中?
- 所有索引都存储在主存中?
我浏览了几个链接,但没有人明确提到这部分?谁能澄清我的问题。谢谢
这取决于数据库服务器的具体实现。使用 SQL 服务器(您已将其标记为服务器),根目录可能始终在内存中,但它也会在磁盘上 - 它必须是 SQL 服务器可以停止和重新启动- 并且可以重新启动实际机器 - 而不会丢失根页面。
我认为 MS 不会对此类内容的实现方式做出任何承诺。提出的方案听起来很明智,但不能保证会发生什么。例如,我想在实际使用索引之前,根页面不会在内存中(为什么要浪费尚未请求的资源?);一旦它被使用,它可能会保存在内存中,但如果一段时间不使用,如果服务器启动 运行 内存不足,它可能会被刷新到磁盘。在任何情况下,对根页面的任何更改都将作为需要更改的事务的一部分刷新到磁盘。
你被告知的在很多方面都是垃圾。
要使 B 树索引正常工作,没有预先设计的方案来存储需要存储的内容。 RDBMS 可以自由决定在何处存储何种数据。
我所知道的大多数 RDBMS 都统一对待所有 B 树页面和所有非树数据页面。有一个用于快速访问的内存缓存,但所有数据也都存储在磁盘上。没有理由区分树木和非树木。此外,在存储该数据时,根页、内页和叶页之间没有区别。
但这并不一定如此,可以做出不同的选择。
树根会被特殊对待的说法肯定是假的。它需要与索引内容一样持久,因此它必须存在于磁盘上。仅将其存储在内存中会丢失索引,以防数据库关闭。
一些数据库系统支持在数据库启动时从持久数据重建的内存索引。这也是一个有效的设计选择。但这是一个选择,不必如此
我在看这个video关于B+树的基础知识,他提到B+树的叶子存储在磁盘上,除了root
存储在main memory
中。我在 class 的教授提到索引存储在 main memory
中,而 leaves
包含指向磁盘的数据指针。
见下图:
我的问题是所有索引到底存储在哪里?
- 我们是否只将根存储在主内存中?
- 所有索引都存储在主存中?
我浏览了几个链接,但没有人明确提到这部分?谁能澄清我的问题。谢谢
这取决于数据库服务器的具体实现。使用 SQL 服务器(您已将其标记为服务器),根目录可能始终在内存中,但它也会在磁盘上 - 它必须是 SQL 服务器可以停止和重新启动- 并且可以重新启动实际机器 - 而不会丢失根页面。
我认为 MS 不会对此类内容的实现方式做出任何承诺。提出的方案听起来很明智,但不能保证会发生什么。例如,我想在实际使用索引之前,根页面不会在内存中(为什么要浪费尚未请求的资源?);一旦它被使用,它可能会保存在内存中,但如果一段时间不使用,如果服务器启动 运行 内存不足,它可能会被刷新到磁盘。在任何情况下,对根页面的任何更改都将作为需要更改的事务的一部分刷新到磁盘。
你被告知的在很多方面都是垃圾。
要使 B 树索引正常工作,没有预先设计的方案来存储需要存储的内容。 RDBMS 可以自由决定在何处存储何种数据。
我所知道的大多数 RDBMS 都统一对待所有 B 树页面和所有非树数据页面。有一个用于快速访问的内存缓存,但所有数据也都存储在磁盘上。没有理由区分树木和非树木。此外,在存储该数据时,根页、内页和叶页之间没有区别。
但这并不一定如此,可以做出不同的选择。
树根会被特殊对待的说法肯定是假的。它需要与索引内容一样持久,因此它必须存在于磁盘上。仅将其存储在内存中会丢失索引,以防数据库关闭。
一些数据库系统支持在数据库启动时从持久数据重建的内存索引。这也是一个有效的设计选择。但这是一个选择,不必如此