复合索引使用什么样的数据结构?

时间:2016-07-28 14:23:54

标签: mongodb

来自MongoDB文档: MongoDB索引使用B树数据结构

但是,它是否也适用于复合指数?在肯定的情况下,它是如何实际实施的?

PD:我想象的唯一方法是作为一个B树,其中每个节点没有单个值,但是存储的索引数量与数据一样多(例如,在数组中)(即好像是两个二叉树(或者更多,每个索引一个)已合并)。

1 个答案:

答案 0 :(得分:2)

我不能在实际实现方面100%确定地说出任何内容,但我确实认为复合索引也实现为B树,正如您所描述的那样,具有值序列的节点(遵循索引键顺序) ),并且,非常重要的是使用关键值的词典顺序。

话虽如此,为了节省一些空间,我还会考虑一个只使用与树顶部第一个键相关联的值的B树,然后第二个键的值稍微向下,...以及靠近树叶的最后一个键的值。这只不过是一种优化,它使节点的边界与各个键重合。

以这种方式实现复合索引的优势(有或没有上述优化)是,如果你有几个键的索引,让我们说 A然后B然后C ,然后你得到一个免费的 A 的索引,以及免费的 A然后B 的索引:实际上,键序列的任何前缀的所有值总是在这样的组合在一起一个B树,因为词典顺序。

由于MongoDB documents就是这种情况,我在使用MongoDB时会想到以这种方式实现复合索引。

此外,文档指定在复合索引上禁止散列索引字段。这是另一个线索,因为B树实现了范围索引。

另外,我希望MongoDB的哈希索引可以用哈希表而不是B树来实现,因为仅使用B树进行点查询效率较低(对数查找与O(1)相比)