2013-01-15 21 views
85

Per Mangusta documentation dla MongooseJS i MongoDB/Node.js:Mongoose indeksowanie w kodzie produkcji

Kiedy aplikacja uruchamia się, Mongoose automatycznie wywołuje ensureIndex dla każdego zdefiniowanego wskaźnika w schemacie. Chociaż jest to dobre dla rozwoju, zaleca się wyłączenie tego zachowania podczas produkcji, ponieważ tworzenie indeksu może mieć znaczący wpływ na wydajność. Wyłącz to działanie, ustawiając opcję Twojego schematu na wartość false.

Wydaje polecić usunięcie automatycznego indeksowania od mangusty przed wdrożeniem w celu optymalizacji Mongoose od instruowania Mongo iść i rezygnacji przez wszystkich indeksów na starcie aplikacji, która 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 zbędne, jeśli pojedyncza aplikacja jest jedynym czytnikiem/programem piszącym do kolekcji, ponieważ będzie kontynuować indeks za każdym razem, gdy wystąpi zapis DB?

Edit: W celu uzupełnienia, MongoDB zapewnia dobry documentation dla jak zrobić indeksowanie, ale nie dlaczego lub gdy dyrektyw indeksowania jawne powinny być zrobione. Wydaje mi się, że indeksy powinny być aktualizowane przez aplikacje piszące automatycznie w kolekcjach z istniejącymi indeksami, a to, że ensureIndex jest naprawdę bardziej jednorazowe (zrobione przy zastosowaniu nowego indeksu), w takim przypadku Mongoose's autoIndex powinno być no-op pod normalnym restartem serwera.

+10

Ktokolwiek uwzględnił to pytanie, podaj przyczynę. – rdrey

Odpowiedz

90

Nigdy nie rozumiem, dlaczego dokumentacja Mongoose tak szeroko zaleca wyłączenie produkcji autoIndex. Po dodaniu indeksu kolejne wywołania po prostu zobaczą, że indeks już istnieje, a następnie powraca. Ma to wpływ tylko na wydajność podczas tworzenia indeksu. W tym czasie zbiory są często puste, więc tworzenie indeksu byłoby szybkie.

Moja sugestia to pozostawienie włączonego autoIndex, chyba że masz konkretną sytuację, w której sprawia ci kłopot; np. jeśli chcesz dodać nowy indeks do istniejącej kolekcji, która ma miliony dokumentów i chcesz mieć większą kontrolę nad tym, kiedy jest tworzony.

+4

Mam pytanie do dodania ... Co zrobić, jeśli ustawię to jako fałszywe? Następnie indeksy zostaną utworzone, gdy wstawię dane lub będę musiał je jawnie utworzyć. Przykro mi, jeśli jest to pytanie początkujące, ale byłoby bardzo pomocne, gdybyś odpowiedział. –

+3

@SaranshMohapatra Kiedy 'autoIndex' jest fałszywe, musisz wywołać model [ensureIndexes] (http://mongoosejs.com/docs/api.html#model_Model.ensureIndexes) w swoim modelu, aby utworzyć jego indeksy. – JohnnyHK

+0

Czy będę musiał go wywołać za każdym razem lub tylko raz definiując model? –

28

Chociaż zgadzam się z przyjętą odpowiedzi, jego Warto zauważyć, że zgodnie z MongoDB manual, to nie jest zalecanym sposobem dodawania indeksów na serwerze produkcyjnym:

Jeśli aplikacja zawiera ensureIndex() operacje , a indeks nie istnieje dla innych problemów operacyjnych, budowanie indeksu może mieć poważny wpływ na wydajność bazy danych.

Aby uniknąć problemów z wydajnością, upewnij się, że aplikacja sprawdza indeksy podczas uruchamiania przy użyciu metody getIndexes() lub równoważnej metody dla sterownika i kończy działanie, jeśli nie istnieją właściwe indeksy. Zawsze buduj indeksy w instancjach produkcyjnych przy użyciu oddzielnego kodu aplikacji podczas wyznaczonych okien konserwacji.

Oczywiście zależy to od struktury i rozmieszczenia aplikacji.Jeśli wdrażasz na przykład Heroku i nie używasz Heroku's preboot feature, to prawdopodobnie aplikacja nie wyświetla żadnych żądań w ogóle podczas uruchamiania, więc prawdopodobnie bezpieczne jest utworzenie indeksu w tym czasie.

Poza tym od przyjętej odpowiedź:

więc ma jedynie wpływ na wydajność, gdy jesteś pierwszy tworzenia indeksu, a w tym czasie zbiory są często pusty więc tworzenia indeksu i tak byłby szybki.

Jeśli udało się uzyskać model danych i kwerendy przybite za pierwszym razem, to jest w porządku, a często w tym przypadku. Jeśli jednak dodajesz nową funkcjonalność do swojej aplikacji, z nowym zapytaniem DB na temat właściwości bez indeksu, często będziesz dodawał indeks do kolekcji zawierającej wiele istniejących dokumentów.

Jest to czas, w którym należy zachować ostrożność przy dodawaniu indeksów i uważnie brać pod uwagę konsekwencje takiego działania. Na przykład możesz: create the index in the background:

+3

OK, więc wszystko, co musisz zrobić, to NIE uruchamiać serwera, dopóki wszystkie wywołania zwrotne sureIndex nie zostaną uruchomione dla każdej kolekcji. –

+0

@AlexMills, jak to zapewnić? – lonelymo

+0

async.each (Object.keys (modele), funkcja (klucz, cb) { modele [klucz] .ensureIndexes (cb) }, cb) –