索引键上的 cursor.skip() 总是更快吗?
Is cursor.skip() on indexed keys always faster?
我有 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
在 fast
数据库上完成的 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 字段上有索引,因此按索引字段搜索速度更快。
分页问题是因为您的查询没有覆盖,这意味着它需要获取完整的文档 - 因此在这种情况下索引不会发挥作用。
您的查询都没有对 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",
我有 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
在 fast
数据库上完成的 work
的数量低于预期的 slow
.此外,indexed/fast db.
但是 当我执行以下操作时:
> 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 字段上有索引,因此按索引字段搜索速度更快。
分页问题是因为您的查询没有覆盖,这意味着它需要获取完整的文档 - 因此在这种情况下索引不会发挥作用。
您的查询都没有对 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",