【发布时间】:2016-11-24 03:55:49
【问题描述】:
pymongo中两个查询的执行时间是否有差异:
db.collection.find({'date': {'$gte': datetime(2000, 01, 01), '$lt': datetime(2016, 11, 23)}})
db.collection.find({'date': {'$gte': datetime(2000, 01, 01)}, 'date': {'$lt': datetime(2016, 11, 23)}})
在第二种情况下,我查询同一个字段两次。我使用 mongo shell 检查并运行 .explain("executionStats"),唯一的区别是查询 ("queryPlanner.parsedQuery") 第一个是:
"$and" : [
{
"date" : {
"$lt" : ISODate("2016-11-23T00:00:00Z")
}
},
{
"date" : {
"$gte" : ISODate("2000-01-01T00:00:00Z")
}
}
]
这是第二个:
"date" : {
"$lt" : ISODate("2016-11-23T00:00:00Z")
}
我正在查询一个包含数万个文档的集合,并且被多次查询。所以,我需要优化查询。
【问题讨论】:
-
“日期”字段是否被索引?如果没有,那应该是提高操作速度的第一步。如果是,两个解释计划在如何应用索引界限之间是否有任何区别?您可能需要再次运行 .explain 并传递 'true' 选项,例如".explain(true)"
-
嘿,我正在查询集合中的多个字段(大约 6 个),索引日期并没有多大帮助。但是
date字段有一个范围,所有其他字段只匹配值相等。所以,我认为@hyades 的回答解释了我的查询实际上是错误的,并且两个查询不等价,因为我们不能为映射类型(在本例中为 python 字典)中的两个不同值拥有相同的键。