在mongodb中使用$sort或阻止使用索引吗?
似乎使用$或进行排序可以进行完整的表扫描,避免使用标题和关键字的索引。在使用$或查询时,如何让它使用我的两个索引 此查询同时使用标题和关键字索引在mongodb中使用$sort或阻止使用索引吗?,mongodb,Mongodb,似乎使用$或进行排序可以进行完整的表扫描,避免使用标题和关键字的索引。在使用$或查询时,如何让它使用我的两个索引 此查询同时使用标题和关键字索引 db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}) 这将执行完整的表扫描,并使用我的索引总计\u1 db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}).sort({total:-1}) 而对关键字或标题
db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]})
这将执行完整的表扫描,并使用我的索引总计\u1
db.tasks.find({$or: [{keywords: /^japan/}, {title:/^japan/}]}).sort({total:-1})
而对关键字或标题进行排序的查询则分别使用关键字或标题的索引
db.tasks.find({title:/^japan/}).sort({total:-1})
db.tasks.find({keywords:/^japan/}).sort({total:-1})
Mongo中的排序和索引是一个复杂的主题。Mongo还有一个特殊错误,如果项目太多,它会阻止您在没有索引的情况下进行排序。因此,您询问索引是件好事,因为未索引的排序最终将开始失败 有一个似乎覆盖了你的问题,但是还有一些额外的细节要考虑。< /P> 首先要注意的是您最后的查询:
db.tasks.find({title:/^japan/}).sort({total:-1})
db.tasks.find({keywords:/^japan/}).sort({total:-1})
这些查询最终将失败,因为您只在title
上编制索引,而不是在title/total
上编制索引。这里有一个脚本可以演示这个问题
> db.foo.ensureIndex({title:1})
> for(var i = 0; i < 100; i++) { db.foo.insert({title: 'japan', total: i}); }
> db.foo.count()
100
> db.foo.find({title: 'japan'}).sort({total:-1}).explain()
... uses BTreeCursor title_1
> // Now try with one million items
> for(var i = 0; i < 1000000; i++) { db.foo.insert({title: 'japan', total: i}); }
> db.foo.find({title: 'japan'}).sort({total:-1}).explain()
Sat Mar 31 05:57:41 uncaught exception: error: {
"$err" : "too much data for sort() with no index. add an index or specify a smaller limit",
"code" : 10128
}
我上面列出的JIRA bug是针对以下内容的:
> db.foo.find({$or: [title:/^japan/, title:/^korea/]}).sort({total:-1})
你的稍有不同,但会遇到同样的问题。即使您在
title/total
和keyword/total
上都有索引,MongoDB也无法最佳地使用索引。如果您有{total:-1,title:1}的索引和{total:-1,title:1}排序,这至少能提高索引扫描的效率吗?@drogon您在筛选什么?里面有find()
子句吗?JIRA错误非常特定于使用带有排序的$或子句。
> db.foo.find({$or: [title:/^japan/, title:/^korea/]}).sort({total:-1})