Python MongoDB优化查找和修改或查找+;分类

Python MongoDB优化查找和修改或查找+;分类,python,mongodb,pymongo,database,Python,Mongodb,Pymongo,Database,运行MongoDB时,我尝试将三列键查找(a、b、c)与优先级(d)一起排队。我有一个类似(pymongo语法)的查询: 当复合索引(a+1、b+1、c+1、d-1)运行explain时,将显示完整的表格扫描和基本计数器 对于d上的单个索引,explain显示仅使用了d索引 对于大型表,我真正想要的是使用复合索引。我怎样才能做到这一点 索引信息: {u'id':{u'key':[(u'u id',1)],u'v':1}, u'color_1_level_1_progress_1_1_排名_-1'

运行MongoDB时,我尝试将三列键查找(a、b、c)与优先级(d)一起排队。我有一个类似(pymongo语法)的查询:

当复合索引(a+1、b+1、c+1、d-1)运行explain时,将显示完整的表格扫描和基本计数器

对于d上的单个索引,explain显示仅使用了d索引

对于大型表,我真正想要的是使用复合索引。我怎样才能做到这一点

索引信息: {u'id':{u'key':[(u'u id',1)],u'v':1}, u'color_1_level_1_progress_1_1_排名_-1':{u'key':[(u'color', 1), (u’level’,1), (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}} 
)   

请注意,当我在排序字段“Ranking”上添加索引时,explain返回正在使用的排序索引。但是,在1.5 MM文档测试语料库上,从来没有使用过复合索引,而且性能非常慢。

有一种方法可以在执行查询时强制使用特定的索引,称为
hint

只需在光标上调用它:

cursor = collection.find({query-doc}).hint({index-fields})

Mongodb索引系统是基于实验的。基本上,查询优化器将使用所有可能的索引运行查询,并比较每个索引的时间。它将学习为给定类型的查询使用最佳索引。 从以下文件:

测试新计划时,MongoDB并行执行多个查询计划。一旦一个执行完成,它就会终止其他的执行,并且系统已经知道哪个计划是好的

如果您的集合非常小,则查询优化器选择的索引可能不是您认为最好的索引。但是,此查询和此集合的速度更快。 当你的收藏长大后,也许另一个索引会更适合你

在您的例子中,我认为mongo更容易扫描所有文档,然后使用d上的索引对它们进行排序,因为您的文档很少

尝试对包含更多文档(比如100万)的集合运行相同的查询(多次以提高学习效率),您可能会看到它将使用完整索引


因此,使用oe提示是没有必要的(尽管它不会造成伤害)。我的建议:让mongo查询优化器完成它的工作:-)

您可以发布db.collection.getIndexes()、查询和explain()的输出吗?是的,但我需要一些时间。我应该在明天早上起床。在修改查询规范以不使用逻辑“$in”或其他运算符并简单地查询特定值之后,mongo决定使用索引。但是它似乎没有将索引用于排序操作,而是更愿意扫描与查询匹配的所有文档。奇怪的我也有同样的问题。。。如果我发现任何东西,我会告诉你,我认为$in相当于对$in数组中的每个元素执行单独的查询。如果使用两个$in运算符,每个运算符有3个元素,则相当于3*3=9个单独的索引查询。我可以潜在地看到查询优化器如何决定表扫描更快。感谢您深入了解mongo如何在幕后确定查询计划。不幸的是,我的测试语料库有超过1.5 MM的文档,查询仍在运行完整的表扫描。我知道我可以通过限制结果集或只针对查询规范中的一系列排名值来更粗略地优化find()操作。但是,这并不能真正帮助我优化findAndModify查询,我需要它,因为此操作需要以原子方式锁定记录。
cursor = collection.find({query-doc}).hint({index-fields})