MongoDB 3.0 z WiredTiger wprowadza nową funkcję o nazwie „Kompresja prefiksu indeksu”, która znacznie zmniejsza pamięć zużywaną przez indeksy. Mniej pamięci używanej przez indeksy oznacza więcej pamięci do przechowywania dokumentów lub innych indeksów, co oznacza lepszą wydajność.
W celu uzyskania najlepszej wydajności w MongoDB dobrze jest przechowywać indeksy w pamięci. Brak strony w indeksie to podwójny błąd — jeden błąd strony powoduje umieszczenie rzeczywistej strony indeksu w pamięci, a drugi błąd strony później powoduje przeniesienie strony danych do pamięci.
Technologia
Kompresja prefiksów indeksów nie wykorzystuje kompresji bloków (takich jak zlib, snappy itp.), ale jest inną techniką przechowywania indeksów w pamięci. Zmniejsza użycie pamięci, przechowując identyczne prefiksy tylko raz. „Kompresja prefiksu klucza” to specyficzny dla domeny sposób kompresji danych i odnosi się do formatu przechowywania kluczy w WiredTiger. Więcej informacji można znaleźć w dokumentacji WiredTiger dotyczącej formatów plików.
Testy wydajności
Do naszych testów wydajności używamy struktury dokumentu opisanej poniżej:
{ employeeID: <long>, firstName: <string>, lastName: <string>, income: <long>, supervisor: {ID: <long>, 'firstName': <string>, 'lastName': <string>;} }
Do tej konfiguracji dodaliśmy następujące indeksy:
Index 1: db.ensureIndex({'employeeID':1}); Index 2: db.ensureIndex({'lastName':1, 'firstName':1}); Index 3: db.ensureIndex({'income':1}); Index 4: db.ensureIndex({'supervisor.lastName':1, 'supervisor.firstName':1})
Wyniki
W naszym teście wstawiliśmy identyczne dane (około 10 milionów rekordów) do dwóch klastrów – jeden zestaw replik 2.6.x, a drugi MongoDB 3.0 z WiredTiger. Następnie dodaliśmy powyższe indeksy w obu konfiguracjach klastra. Wyniki są dość oszałamiające – w niektórych przypadkach istnieje różnica rzędu wielkości w rozmiarze indeksu!
Nazwa indeksu | Rozmiar indeksu MMAP (MB) | Rozmiar indeksu WT (MB) | % Zmniejszenie rozmiaru |
{employeeID:1} | 230.7 | 94 | 59% |
{lastName:1, firstName:1} | 1530 | 36 | 97% |
{dochód:1} | 230 | 94 | 59% |
{‘supervisor.lastName’:1, ‘supervisor.firstName’:1} | 1530 | 35 | 97% |
Cała pamięć zapisana na indeksach to pamięć, którą można wykorzystać do buforowania danych, innych indeksów itp. Twój przebieg może się różnić – koniecznie przetestuj swoją konkretną strukturę indeksu. Zmniejszenie rozmiarów indeksów jest znacznie niedostatecznie sprzedawanym ulepszeniem w Mongo 3.0 i może mieć ogromny wpływ na wydajność!