Оптимизаторът на заявки MongoDB работи, като изпробва различни планове, за да определи кой подход работи най-добре за дадена заявка. Печелившият план за този модел на заявка след това се кешира за следващите ~1000 заявки или докато не направите explain()
.
За да разберете кои планове за заявки са били взети предвид, трябва да използвате explain(1)
, напр.:
db.col.find({category:'A'}).sort({updated: -1}).explain(1)
allPlans
подробности ще покажат всички сравнени планове.
Ако изпълните заявка, която не е много селективна (например, ако много записи отговарят на вашите критерии за {category: { $ne:'A'}}
), може да е по-бързо за MongoDB да намери резултати с помощта на BasicCursor (сканиране на таблица), вместо да съвпада с индекс.
Редът на полетата в заявката обикновено не прави разлика за избора на индекс (има няколко изключения със заявките за диапазон). Редът на полетата в сортиране оказва влияние върху избора на индекс. Ако вашият sort()
критериите не съответстват на реда на индекса, данните за резултата трябва да бъдат повторно сортирани, след като индексът се използва (трябва да видите scanAndOrder:true
в изхода за обяснение, ако това се случи).
Също така си струва да се отбележи, че MongoDB ще използва само един индекс на заявка (с изключение на $or
s).
Така че, ако се опитвате да оптимизирате заявката:
db.col.find({category:'A'}).sort({updated: -1, rating: -1})
Ще искате да включите и трите полета в индекса:
db.col.ensureIndex({category: 1, updated: -1, rating: -1})
FYI, ако искате да принудите определена заявка да използва индекс (обикновено не е необходим или препоръчан), има hint()
опция, която можете да опитате.