mongodb - 为什么索引的方向在 MongoDB 中很重要?

引用 docs :

When creating an index, the number associated with a key specifies the direction of the index, so it should always be 1 (ascending) or -1 (descending). Direction doesn't matter for single key indexes or for random access retrieval but is important if you are doing sorts or range queries on compound indexes.

但是,我认为没有理由说明索引方向对复合索引很重要。有人可以提供进一步的解释(或示例)吗?

最佳答案

MongoDB 以某种方式连接复合键并将其用作 BTree 中的键。

查找单个项目时 - 树中节点的顺序无关紧要。

如果您要返回一系列节点 - 彼此靠近的元素将位于树的相同分支下。节点在范围内越近,检索它们的速度就越快。

使用单个字段索引 - 顺序无关紧要。如果它们按升序排列,它们也将按降序排列。

当您拥有复合键时 - 顺序开始变得重要。

例如,如果键是 A 升序 B 升序,则索引可能如下所示:

Row   A B
1     1 1
2     2 6
3     2 7 
4     3 4
5     3 5
6     3 6
7     5 1

对 A 升序 B 降序的查询将需要乱序跳转索引以返回行,并且会更慢。例如它将返回行 1, 3, 2, 6, 5, 4, 7

与索引顺序相同的范围查询只会以正确的顺序依次返回行。

在 BTree 中查找记录需要 O(Log(n)) 时间。按顺序查找记录范围只需 OLog(n) + k,其中 k 是要返回的记录数。

如果记录乱序,代价可能高达OLog(n) * k

https://stackoverflow.com/questions/10329104/

相关文章:

ruby-on-rails - 如何实现has_many :through relationship

mongodb - 蒙哥界面

mongodb - mongodb 在 CAP 定理中处于什么位置?

mongodb - 与关系数据库相比,使用像 MongoDB 这样的无模式数据库有什么优势?

python - 在 PyMongo 中使用 .sort

node.js - 如何使用 Mongoose 删除数据库?

javascript - 有没有办法将 'pretty' 打印 MongoDB shell 输出到文

linux - 如何避免来自 mongodb 的 transparent_hugepage/defr

mongodb - 包括所有现有字段并将新字段添加到文档

java - 获取带有 Java 驱动程序的 mongoDB 中最后插入的文档的 ID