【发布时间】:2012-08-20 10:40:00
【问题描述】:
运行 MongoDB,我正在尝试将具有优先级 (d) 的三列键查找 (a,b,c) 排队。我有一个类似(pymongo 语法)的查询:
collection.find({'a':'foo','b':'bar','c':'baz'}, sort = [('d', -1)] )
使用复合索引 (a+1,b+1,c+1,d-1) 运行解释显示全表扫描和 BasicCursor。
对于 d 上的单个索引,explain 显示仅使用 d 索引。
对于一个大表,我真正想要的是使用复合索引。我怎样才能做到这一点?
索引信息: {u'id': {u'key': [(u'_id', 1)], u'v': 1}, u'color_1_level_1_in_progress_1_Ranking_-1': {u'key': [(u'color', 1), (u'level', 1), (u'in_progress', 1), (u'排名', -1)], u'v': 1}}
EXPLAIN ON A FIND+SORT QUERY
db.coll.find({'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green]} }, sort = [('Ranking', -1)] ).explain()
OUTPUT ON EXPLAIN
OperationFailure: database error: too much data for sort() with no index. add an index or specify a smaller limit
THE QUEUEING QUERY I CARE ABOUT OPTIMIZING
coll.find_and_modify(
query = {'level' : {'$in' : [0,1,2]}, 'in_progress' : 0, 'color' : {'$in' : ['Red', 'Blue', 'Green']} },
sort = {'Ranking' : -1},
update = {'$set': {'in_progress': 1}}
)
请注意,当我在排序字段“排名”上添加索引时,解释返回正在使用排名索引。但是从不使用复合索引,并且在 1.5 MM 的文档测试语料库上性能非常慢。
【问题讨论】:
-
能否发布 db.collection.getIndexes()、查询和 explain() 的输出?
-
是的,但我需要一些时间。明天早上应该起床。
-
我应该跟进,在更改查询规范以不使用逻辑 '$in' 或其他运算符并简单地查询特定值之后,mongo 想出使用索引。但!它似乎没有使用索引进行排序操作,而是更愿意扫描与查询匹配的所有文档。奇怪!
-
我遇到了同样的问题...如果我找到任何东西,我会告诉你
-
我认为 $in 相当于对 $in 数组中的每个元素执行单独的查询。如果您使用两个 $in 运算符,每个运算符有 3 个元素,则相当于 3*3 = 9 个单独的索引查询。我可能会看到查询优化器如何决定表扫描更快。
标签: python mongodb pymongo database