我们有一个包含大约1M文档的mongo数据库,我们希望使用已处理的字段轮询此数据库以查找我们之前未见过的文档。为此,我们设置了一个名为_processed
的新字段。
要查询需要处理的文档,我们查询没有此处理字段的文档:
db.stocktwits.find({ "_processed" : { "$exists" : false } })
但是,此查询每次完成大约需要30秒,这相当慢。有一个索引(asc)位于_processed字段:
db.stocktwits.ensureIndex({ "_processed" : -1 },{ "name" : "idx_processed" });
添加此索引不会更改查询性能。集合上还有一些其他索引(即ID idx和每个文档中几个字段的唯一索引)。
_processed字段很长,也许这应该改为bool以使事情更快?
我们尝试使用$ where查询(即$where : this._processed==null
)来执行与$exists : false
相同的操作,性能大致相同(几秒慢,这是有道理的)...
关于什么会缓慢性能缓慢(或者是正常的)的任何想法?有没有人对如何提高查询速度有任何建议?
干杯!
答案 0 :(得分:5)
升级到2.0将为您完成此任务:
来自MongoDB.org:
Before v2.0, $exists is not able to use an index. Indexes on other fields are still used.
答案 1 :(得分:4)
它很慢,因为检查_processed -> not exists
并没有提供太多的选择性。它就像拥有“性别”的索引一样 - 因为只有两个可能的选项male
或female
,如果你有1M行和Gender
上的索引,则必须扫描50 %或500K行可查找所有男性。
您需要使您的索引更具选择性。