经过一番研究和论文阅读后,我找到了答案。
为了处理大量的数据,例如数百万条记录,索引必须组织成簇。群集是磁盘上连续的一组扇区,可以快速读入内存。这些通常长约4096字节。
这些群集中的每一个都可以包含一堆索引,这些索引可以指向磁盘上的其他群集或数据。因此,如果我们有链接列表索引,则索引的每个元素将由包含在单个集群中的索引集合(比如100)组成。
所以,当我们在寻找一个特定的记录时,我们如何知道它在哪个簇上。我们执行二进制搜索来查找正在讨论的集群[O(log n)]。
但是,要进行二分搜索,我们需要知道每个集群中值的范围,因此我们需要元数据来表示每个集群的最小值和最大值以及该集群的位置。这很棒。除了每个群集可以包含100个索引,并且我们的元数据也保存在一个群集中(为了提高速度),那么我们的元数据只能指向100个群集。
如果我们想要超过100个群集会发生什么情况。我们必须有两个元数据索引,每个索引指向100个集群(10000条记录)。那还不够。让我们添加另一个元数据集群,现在我们可以访问1 000 000条记录。那么,我们如何知道为了找到我们的目标数据集群,我们需要查询三个元数据集群中的哪一个。我们可以搜索另一个,但不会扩展。因此,我添加了另一个元元数据群集来指示我应该查询哪三个元数据群集来查找目标数据群集。现在我有一棵树!
所以这就是数据库使用树的原因。它不是索引大小的速度,而是需要索引引用其他索引。上面描述的是B +树 - 子节点包含对其他子节点或叶节点的引用,并且叶节点包含对磁盘上数据的引用。
唷!
从链接列表中删除元素很容易 - 您只需从先前元素的指针指向要删除的元素。如果你想添加,你只需要:A-> C变成A-> B-> C,所以你只需将B指向C然后A指向B.就像我说的,树中的叶节点只是一个链表。链接列表中的分组搜索比树更容易。再次,我没有看到树结构的好处。 –
这很容易,但你需要保持链接列表的顺序,这就是问题所在。 为了在您执行的每项操作中保持顺序,您必须事先找到确切的位置,而且这个位置会随着元素的不同而不同,并且通常与元素的数量成线性关系。 在树中,成本将是对数插入的元素数量,并且对于每个元素都是相同的,这要归功于b +树的平衡属性。 – Matteo
不正确。在排序列表中查找axact位置是O(log n)。树搜索是二分搜索的一种。此外,树中每个级别上的节点都是索引指针列表。 –