比方一个度为 d 的 B-Tree,设其索引 N 个 key,则其树高 h 的上限为 logn(N/2),检索一个 key,其查找节点个数的渐进复杂度为 O(logn((N+1)/2))。从这点可以看出,B-Tree 是一个非常有服从的索引数据结构。 局部性原理
而这种多个节点的结构,还可以很好的借助磁盘预读的特性。
由于存储介质的特性,磁盘本身存取就比主存慢许多,再加上机器运动耗费,磁盘的存取速度往往是主存的几百分分之一,因此为了进步服从,要只管减少磁盘 I/O。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,纵然只需要一个字节,磁盘也会从这个位置开始,次序向后读取肯定长度的数据放入内存。如许做的理论依据是计算机科学中闻名的局部性原理:当一个数据被用到时,其附近的数据也通常会立刻被利用。步伐运行期间所需要的数据通常比较集中。由于磁盘次序读取的服从很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的步伐来说,预读可以进步 I/O 服从。
在B树中,将一个节点的大小设为等于一个页,如许每个节点只需要一次I/O就可以完全载入。为了达到这个目的,在实际实现B树还需要利用如下本领:<br />每次新建节点时,直接申请一个页的空间,如许就包管一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个节点只需一次I/O。
但是 B 树的每个节点都包含数据(索引+记录),而用户的记录数据的大小很有大概远远超过了索引数据,这就需要花费更多的磁盘 I/O 利用次数来读到「有用的索引数据。而且,在我们查询位于底层的某个节点(比如 A 记录)过程中,「非 A 记录节点」里的记录数据会从磁盘加载到内存,但是这些记录数据是没用的,我们只是想读取这些节点的索引数据来做比较查询,而「非 A 记录节点」里的记录数据对我们是没用的,如许不但增多磁盘 I/O 利用次数,也占用内存资源。