【发布时间】:2016-06-28 19:07:40
【问题描述】:
我有 2 个数据库:slow 和 fast;每个都输入了 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})
如果我测试find 和sort,work 的数量已在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