我遇到麻烦让查询在合理的时间内运行。我正在使用的集合是大约1亿个文档。当我运行currentOp()命令检出查询时,它似乎正在扫描所有文档。
db.collection.find({
"field_1": {"$not": /^Some_Regex/},
"field_2": "value_1",
"timestamp_field": {"$gte": ISODate("2016-12-01T00:00:00.000+0000")}
}).sort({"field_1": 1})
我正在传递:
{"field_1": 1, "timestamp_field": -1}
我对复合索引如何工作的理解是它创建了一个表:
field_1 timestamp_field
a 2016-12-03 00:00:00
a 2016-12-02 00:00:00
a 2016-12-01 00:00:00
a 2016-11-30 00:00:00
a 2016-12-29 00:00:00
现在它应该能够筛选出field_1
和timestamp_field
的要求不匹配的任何文档。我希望这个查询只需要扫描最大值,这个查询的结果是:
db.collection.count({
"field_1": {"$not": /^Regex/},
"timestamp_field": {"$gte": ISODate("2016-12-01T00:00:00.000+0000")}
}).sort({"field_1": 1})
我应该在三个字段上使用索引吗?我应该使用不同的索引吗? {"field_2": "value_1"}
有超过50M的动作,这就是我选择在其他两个领域创建复合索引的原因。
对此查询速度如此之慢的任何帮助都将不胜感激。