索引键上的 cursor.skip() 总是更快吗?

Is cursor.skip() on indexed keys always faster?

我有 2 个数据库:slowfast;每个都有 4096 个条目。 age 密钥是使用此脚本生成的唯一随机整数:

var arr = []
while(arr.length < 4096){
  var randmnum=Math.ceil(Math.random()*1000000)
  var found=false;
  for(var i=0;i<arr.length;i++){
    if(arr[i]==randmnum){found=true;break}
  }
  if(!found)arr[arr.length]=randmnum;
}

var i=0;
for (i=0 ; i< arr.length; ++i) {
    db.fast.insert({name:"john doe", email:"once@upon.a.time.com", age:arr[i]});
    db.slow.insert({name:"john doe", email:"once@upon.a.time.com", age:arr[i]});
}

然后在 mongo shell:

> db.createCollection("slow")
> db.createCollection("fast")
> load("theAboveScript.js")
> db.fast.createIndex({"age":1})

如果我测试 findsortfast 数据库上完成的 work 的数量低于预期的 slow .此外,indexed/fast db.

的执行时间大约缩短了 2 倍

但是 当我执行以下操作时:

> pageNumber=18;nPerPage=20; db.slow.find().skip(pageNumber > 0 ? ((pageNumber-1)*nPerPage) : 0).limit(nPerPage).explain("executionStats")
> pageNumber=18;nPerPage=20; db.fast.find().skip(pageNumber > 0 ? ((pageNumber-1)*nPerPage) : 0).limit(nPerPage).explain("executionStats")

工作量完全一样,执行时间也差不多,即使是 fast db 也有点慢。

为什么 cursor.skip() 在索引键上工作时没有得到任何提升?我希望分页到 return 没有明确排序的分页数据。

如显示的那样,您在 AGE 字段上有索引,因此按索引字段搜索速度更快。

分页问题是因为您的查询没有覆盖,这意味着它需要获取完整的文档 - 因此在这种情况下索引不会发挥作用。

Please see this for reference

您的查询都没有对 age 进行筛选,因此没有理由使用索引。

如果您在 age 上添加条件,将会有所不同(即使文档很少,即使最小)

> pageNumber=18;nPerPage=20; db.slow.find({age:{$gt:200}}).
      skip(pageNumber > 0 ? ((pageNumber-1)*nPerPage) : 0).limit(nPerPage).
      explain("executionStats")

# "executionTimeMillis" : 14,
# "inputStage" : {
#     "stage" : "COLLSCAN",

> pageNumber=18;nPerPage=20; db.fast.find({age:{$gt:200}}).
      skip(pageNumber > 0 ? ((pageNumber-1)*nPerPage) : 0).limit(nPerPage).
      explain("executionStats"

# "executionTimeMillis" : 0,
# "inputStage" : {
#     "stage" : "IXSCAN",