MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo индекс за период от време с филтри

Няколко ключови точки от изхода на плана за обяснение:

  • Заявката адресира следните атрибути: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 документа.

И така, вашият индекс обхваща само 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() изходът ви казва.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Flask бавно прави заявки към Mongdb

  2. Mongoose не чете от вторичната база данни Mongo

  3. Върнете определени полета с .populate() от Mongoose

  4. ГРЕШКА:дъщерен процес е неуспешен, излязъл е с грешка номер 48

  5. Как да настроите отделна база данни за тестване и разработка в meteor