【问题标题】:Is cursor.skip() on indexed keys always faster?索引键上的 cursor.skip() 总是更快吗?
【发布时间】:2016-06-28 19:07:40
【问题描述】:

我有 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})

如果我测试findsortwork 的数量已在fast db 上低于预期的slow。此外,使用索引/快速数据库的执行时间大约提高了 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() 在索引键上工作时不会得到任何提升?我希望分页返回有序的分页数据而不显式排序。

【问题讨论】:

    标签: javascript mongodb indexing cursor query-optimization


    【解决方案1】:

    如图所示,您在 AGE 字段上有索引,因此按索引字段搜索会更快。

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

    Please see this for reference

    【讨论】:

      【解决方案2】:

      您的两个查询都没有对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",
      

      【讨论】:

        猜你喜欢
        • 2010-10-25
        • 2019-05-10
        • 2015-10-11
        • 2017-09-11
        • 2016-06-30
        • 2021-09-25
        • 1970-01-01
        • 2014-12-31
        相关资源
        最近更新 更多