Ако дадена заявка може да бъде удовлетворена от множество индекси, дефинирани в колекцията, MongoDB ще тества всички приложими индекси паралелно. Първият индекс, който може да върне 101 резултата, ще бъде избран от програмата за планиране на заявки. Има и други аспекти за избор на индекс, но като цяло това е вярно според Оптимизиране на заявки документация.
Този метод за избор на индекс може да избере неоптимален индекс. Това е така, защото от гледна точка на MongoDB имате множество индекси, които описват едно и също нещо. За да смекчите неоптималния избор на индекс, който наблюдавате, можете да направите:
-
Премахнете всички други индекси, за които установите, че не са оптимални.
Това е, за да се гарантира, че инструментът за планиране на заявки няма друг избор, освен да избере индекси, които сте съобразили с вашата заявка.
-
Използвайте
hint()
методаhint()
ви позволява изрично да кажете на MongoDB да използва предписания индекс за заявката. Например:db.tasks.find(...).hint({project: 1, created_by: 1})
Моля, вижте https://docs.mongodb.com/v2. 6/reference/operator/meta/hint/ за повече информация относно
hint()
.
Друг нюанс във вашата заявка е, че тя включва $or
оператор. В този случай всеки термин в $or
изразът трябва да има индекс, свързан с него , в противен случай MongoDB ще извърши сканиране на колекция (BasicCursor
в условията на MongoDB 2.6). Това е обяснено по-подробно на https://docs .mongodb.com/v2.6/reference/operator/query/or/#behaviors