我在mongo db中编写了一个使用索引的查询(两者都用于查询作为排序部分)。如果我解释我得到的查询:
"cursor" : "BtreeCursor state_1_lastModified_-1",
"scanAndOrder" : false,
"indexOnly" : false,
"stats":
"LIMIT" -> "SKIP" -> "FETCH" -> "IXSCAN"
为什么mongo在获取之前无法跳过并限制索引? 我知道我可以使用范围查询来避免使用限制和跳过。
答案 0 :(得分:1)
如果索引完全满足您的过滤条件,那么查询计划器应该在 FETCH 之前跳过。这实际上是向 mongodb 人员报告的,他们已经在 https://jira.mongodb.org/browse/SERVER-13946 中解决了这个问题。该修复程序已向后移植。它出现在从 3.4.19 开始的 3.4.X、从 3.6.9 开始的 3.6.X、从 4.0.3 开始的 4.0 和从 4.1.2 开始的 4.1.X 中。也就是说,如果您在“3.6”发布分支上,那么您至少需要 3.6.9 才能看到更改。
答案 1 :(得分:0)
我认为这只是为了简单起见。
假设db.collection具有以下文档
{x: 1, y: 1}
{x: 2, y: 3}
{x: 3, y: 4}
<强> QUERY1 强>
db.collection.find()。sort({x:1})。skip(1).limit(2)
阶段链可以是IXSCAN ==> SKIP ==> FETCH ==> LIMIT
<强> QUERY2 强>
db.collection.find({x:2,y:3})。sort({x:1})。skip(1).limit(2)
阶段链必须为IXSCAN ==> FETCH ==> SKIP ==> LIMIT
为简单起见,所有案例都可以实现为IXSCAN ==> FETCH ==> SKIP ==> LIMIT
。