Zgodnie z dokumentacją Mongoose dla MongooseJS
i MongoDB
/ Node.js
:
Po uruchomieniu aplikacji Mongoose automatycznie wywołuje
ensureIndex
każdy indeks zdefiniowany w schemacie. Chociaż jest to przyjemne dla programowania, zaleca się wyłączenie tego zachowania w środowisku produkcyjnym, ponieważ tworzenie indeksu może mieć znaczący wpływ na wydajność. Wyłącz to zachowanie, ustawiającautoIndex
opcję schematu na wartość false.
Wydaje się, że instruuje to usunięcie automatycznego indeksowania z Mongoose przed wdrożeniem, aby zoptymalizować Mongoose od instruowania Mongo, aby przeszedł i przeszedł przez wszystkie indeksy podczas uruchamiania aplikacji, co wydaje się mieć sens.
Jaki jest właściwy sposób obsługi indeksowania w kodzie produkcyjnym? Może zewnętrzny skrypt powinien generować indeksy? A może ensureIndex
jest niepotrzebne, jeśli pojedyncza aplikacja jest jedynym czytnikiem / piszącym w kolekcji, ponieważ będzie kontynuować indeksowanie za każdym razem, gdy nastąpi zapis bazy danych?
Edycja: aby uzupełnić, MongoDB zapewnia dobrą dokumentację dotyczącą sposobu indeksowania, ale nie wyjaśnia, dlaczego lub kiedy należy wykonać jawne dyrektywy indeksowania. Wydaje mi się, że indeksy powinny być aktualizowane automatycznie przez aplikacje pisarza w kolekcjach z istniejącymi indeksami, a to ensureIndex
jest raczej jednorazowa czynność (wykonywana, gdy stosowany jest nowy indeks), w którym to przypadku indeks Mongoose autoIndex
powinien być no-op przy normalnym restarcie serwera.
autoIndex
ma wartość false, musisz wywołać w modelu sureIndexes, aby utworzyć jego indeksy.Chociaż zgadzam się z zaakceptowaną odpowiedzią, warto zauważyć, że zgodnie z instrukcją MongoDB nie jest to zalecany sposób dodawania indeksów na serwerze produkcyjnym:
Oczywiście tak naprawdę zależy to od struktury i wdrożenia aplikacji. Jeśli na przykład wdrażasz aplikację do Heroku i nie używasz funkcji wstępnego rozruchu Heroku , prawdopodobnie Twoja aplikacja w ogóle nie obsługuje żądań podczas uruchamiania, więc prawdopodobnie w tym czasie bezpiecznie jest utworzyć indeks.
Oprócz tego z zaakceptowanej odpowiedzi:
Jeśli udało Ci się uzyskać model danych i zapytania na pierwszy raz, to jest w porządku i często tak jest. Jeśli jednak dodajesz nową funkcjonalność do swojej aplikacji, z nowym zapytaniem DB dotyczącym właściwości bez indeksu, często zdarza się, że dodajesz indeks do kolekcji zawierającej wiele istniejących dokumentów.
Jest to czas, w którym należy uważać przy dodawaniu indeksów i dokładnie rozważyć wpływ tego na wydajność. Na przykład możesz utworzyć indeks w tle :
źródło
ensureIndex
ma.createIndex
Zamiast tego jest . Czy mam rację?użyj tego kodu blokowego do obsługi trybu produkcyjnego:
źródło