运行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)的情况下,explain显示全表扫描和BasicCursor.
在d上有一个索引时,说明显示仅使用d索引.
对于大表,我真正想要的是使用复合索引.我该如何进行这项工作?
INDEX_INFORMATION:
{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’Ranking’,-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文档测试语料库上的性能非常低.
解决方法:
有一种在执行查询时强制使用特定索引的方法,称为提示.
只需在游标上调用它即可:
cursor = collection.find({query-doc}).hint({index-fields})