从MongoDB文档:MongoDB索引使用B树数据结构.
但是,它是否也适用于复合指数?在肯定的情况下,它是如何实际实施的?
PD:我想象的唯一方法是作为一个B树,其中每个节点都没有单个值,但是存储的索引数量与数据一样多(例如,在数组中)(即好像是两个二叉树(或更多,一个)对于每个索引)已合并).
最佳答案 我不能在实际实现上100%确定地说出任何内容,但我确实认为复合索引也实现为B树,正如您所描述的那样,具有值序列的节点(遵循索引键顺序),以及,非常重要的是使用关键值的词典顺序.
话虽如此,为了节省一些空间,我还会考虑一个B树,它只使用与树顶部第一个键相关联的值,然后第二个键的值稍微向下,… .以及靠近树叶的最后一个键的值.这只不过是使节点边界与各个键重合的优化.
以这种方式实现复合索引的优点(有或没有上述优化)是,如果你有几个键的索引,让我们说A然后B然后C,那么你就可以免费获得A的索引,以及A然后B的索引是免费的:实际上,由于词典顺序,键序列的任何前缀的所有值总是在这样的B树中组合在一起.
由于MongoDB documents就是这种情况,我想到在使用MongoDB时以这种方式实现复合索引.
此外,文档指定在复合索引上禁止散列索引字段.这是另一个线索,因为B树实现了范围索引.
此外,我希望MongoDB的哈希索引可以用哈希表而不是B树来实现,因为仅使用B树进行点查询效率较低(对数查找与O(1)相比)