Няколко ключови точки от изхода на плана за обяснение:
- Заявката адресира следните атрибути:
siteId, status, creationDate, reportCount, assignee, parent
- Печелившият план има два етапа:
- IX_SCAN използва
creationDate_1_reportCount_1_label_1
, това използва индексирани търсения наcreationDate
иreportCount
за идентифициране на 56 документа, които след това се препращат към етапа FETCH - FETCH получава 56 документа от етапа IX_SCAN и след това разпитва тези документи, за да приложи
siteId
,status
,assignee
иparent
филтри. Това запитване кара 37 документа да бъдат изхвърлени, което води до връщане на 19 документа.
- IX_SCAN използва
И така, вашият индекс обхваща само 2 от 6-те атрибута в заявката ви, а останалите 4 атрибута в заявката ви се прилагат чрез изследване на документите не индекса . Ако искате тази заявка да бъде покрита изцяло от индекса, създайте следния индекс:
db.collection.createIndex(
{siteId: 1, status: 1, creationDate: 1, reportCount: 1, assignee: 1, parent: 1}
)
Ако стартирате отново с този индекс на място, тогава трябва да откриете, че (a) MongoDB избира този индекс и (b) броят на документите, препратени от етапа IX_SCAN, е същият като броя на документите, върнати от вашето извикване за намиране.
Казвам "трябва да намеря" тъй като тук има други аспекти, които могат да доведат до избора на MongoDB различен индекс, напр. използване на $nor
и етапа на сортиране (creationDate: 1
). Бих препоръчал да променяте индекса и да стартирате с обяснение „включено“ след всяко ощипване и да търсите тези ключови елементи в executionStats
поддокумент:
- „nВърнато“
- "totalKeysExamined"
- "totalDocsExamined"
Едно просто правило е следното:колкото по-близо е totalKeysExamined
е към nReturned
и по-близкият totalDocsExamined
е на нула ... толкова по-добро е покритието на вашия индекс.
Съществува и въпросът за цената на индекса (от гледна точка на въздействието върху времето за запис и съхранението на индекса), така че бих предложил да вземете предвид вашите нефункционални изисквания - може ли да се постигнат желаните от вас изминали времена без пълно покритие на индекса? Ако не, тогава трябва да продължите с емпирично тестване, но бъдете готови да промените избора си в отговор на това, което explain()
изходът ви казва.