Това беше обяснено в 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
се използва за фина настройка и определяне защо някои планове са отхвърлени.