En utilisant MongoDB, j'essaie de mettre en file d'attente une recherche de clé à trois colonnes (a,b,c) avec un rang de priorité (d). J'ai une requête comme (syntaxe pymongo) :
collection.find({'a':'foo','b':'bar','c':'baz'}, sort = [('d', -1)] )
Avec un index composé (a+1,b+1,c+1,d-1), l'exécution d'un explain montre un balayage complet de la table et un BasicCursor.
Avec un seul index sur d, explain montre que l'index d seul est utilisé.
Pour une grande table, ce que je veux vraiment, c'est utiliser l'index composé. Comment puis-je faire en sorte que cela fonctionne ?
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'niveau', 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}}
)
Notez que lorsque j'ajoute un index sur le champ de tri 'Ranking', l'explication indique que l'index Ranking est utilisé. Mais l'index composé n'est jamais utilisé et les performances sont très lentes sur un corpus de test de 1,5 millions de documents.