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

Защо различните планове за заявки на MongoDB показват различна nReturned стойност?

Това беше обяснено в allPlansExecution Mode страница с документация. Перифразирайки:

По време на избора на план, ако има повече от един индекс, който може да удовлетвори заявка, MongoDB ще проведе пробен период, като използва всички валидни планове, за да определи кой от тях е най-добрият. Вижте Планове за заявки за подробности относно този процес.

От MongoDB 3.4.6, изборът на план включва паралелно изпълнение на кандидат планове в „състезание“ и вижте кой кандидат план връща 101 резултата първи. Във вашия пример по-горе, докато печелившият план върне 101 резултата в състезанието, губещият план успя да постигне само 2 резултата. След това печелившият план се изпълнява докрай. Това е причината губещият план да показва само nReturned: 2 в статистиката.

Това „състезание“ се извършва, тъй като ако има два еднакво изглеждащи плана, MongoDB не знае кой план е най-добрият за конкретна заявка поради гъвкавостта на JSON документите (за разлика например от SQL, където структурата на таблиците е известна) . Разбира се, напълно е възможно MongoDB да отгатне грешно и да завърши с по-малко ефективен план, тъй като това е емпиричен процес. Поради тази причина е най-добре да създадете индекси, които поддържат вашите заявки, така че MongoDB да не се налага да гадае. В противен случай можете да използвате hint() за да кажете на MongoDB кой индекс да използва за определена заявка.

Следователно:

  • Статистиката за печелившия план е статистиката за резултатите от действителната заявка.
  • Статистиката за губещия(ите) план(ове) показва само статистиката за пробното изпълнение на планирането на заявката.
  • Изборът на план включва провеждане на „състезание“ до 101 резултата. Това състезание се извършва само когато има множество индекси, които могат да задоволят заявката.

Забележка 1 :Нито един от двата плана, които видяхте, не беше страхотен. Печелившият план показва "nReturned" : 43 , "totalKeysExamined" : 221 и "totalDocsExamined" : 219 . Това означава, че MongoDB трябва да прегледа 219 документа само за да върне 43 от тях:само 20% ефективност . В идеалния случай искате да имате nReturned числа, равни на totalDocsExamined .

Забележка 2 :Опитайте да създадете съставния индекс {'rack_name': 1, 'timestamp': 1} . Със същата заявка трябва да получите по-добро число за ефективност.

Забележка 3 :Имайте предвид, че от allPlansExecution беше посочено, всички статистиката ви се връща надлежно от MongoDB за изчерпателност, но няма никакво отношение към крайния nReturned резултат. Това беше отхвърлен план и nReturned: 2 номерната бъдете объркващи. Няма да видите тази статистика, ако използвате executionStats настройка. На първо място, allPlansExecution се използва за фина настройка и определяне защо някои планове са отхвърлени.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Изпълнение на персонализирана функция на MongoDB с помощта на Casbah/Scala

  2. Агрегиране по дата в Mongodb

  3. Не може да се свърже Robomongo с помощта на MongoDB докер изображение

  4. MongoDB изчислява резултат от съществуващи полета и го поставя в ново поле в същата колекция

  5. mongodb:limit() ще увеличи ли скоростта на заявката?