Skip to main content
idego
Rozwój Oprogramowania

Zaawansowane indeksowanie PostgreSQL w Django

Autor: Idego Group

Zaawansowane indeksowanie PostgreSQL w Django

Utrzymanie dużych baz danych jest wyzwaniem dla programistów. Duże zbiory danych zazwyczaj ograniczają wydajność API, dlatego trzeba je optymalizować. W aplikacjach webowych szczególnie ważny jest czas odpowiedzi serwera.

Indeks to struktura bazy danych przechowująca przefiltrowane wartości kolumn ze wskaźnikami do odpowiadających im wierszy tabeli. Indeksy doskonale przyspieszają zapytania SQL do odczytu, choć negatywnie wpływają na szybkość operacji zapisu. Programiści często pomijają fakt, że optymalizacja obejmuje zarówno wzrost wydajności, jak i rozsądne zarządzanie zasobami.

Indeks B-drzewa

Domyślny typ indeksu PostgreSQL, indeks B-drzewa, tworzy struktury drzewiaste organizujące wartości kluczy w kolejności rosnącej. Każdy blok odwołuje się do bloków podrzędnych zawierających mniejsze lub większe wartości, umożliwiając efektywne przeszukiwanie poprzez operacje porównania. Testowanie na zestawie danych IMDb z ponad 9 milionami wierszy wykazało dużą poprawę wydajności. Proste wyszukiwanie bez indeksowania wymagało sekwencyjnego skanowania tabeli. Dodanie db_index=True do pola modelu Django spowodowało skanowanie indeksu, redukując czas wykonania do poniżej 1 milisekundy.

Indeks pokrywający (inkluzywny)

Indeksy pokrywające wbudowują dodatkowe wartości kolumn w strukturę indeksu, umożliwiając operacje Index Only Scan, które całkowicie omijają dostęp do tabeli. Ta optymalizacja jest odpowiednia do wyszukiwania konkretnych wartości. Implementacja następuje przez klasę Meta Django przy użyciu UniqueConstraint z parametrami include, choć rozmiar indeksu wzrasta.

Indeks częściowy (warunkowy)

Indeksy częściowe optymalizują miejsce na dysku, indeksując tylko wiersze spełniające określone warunki. W zestawie danych IMDb filmy stanowiły zaledwie 7% wpisów. Utworzenie częściowego indeksu filtrującego dla title_type=movie zmniejszyło rozmiar indeksu siedmiokrotnie przy zachowaniu wydajności zapytań.

Indeks Hash

Indeksy hash stosują funkcje skrótu do wartości kolumn, rozmieszczając je w kubełkach. Doskonale sprawdzają się przy prawie unikalnych danych, znacząco zmniejszając miejsce na dysku (około 38% rozmiaru B-drzewa) dla długich wartości ciągów tekstowych, takich jak tytuły filmów, choć rezygnują z możliwości sortowania i obsługi zapytań zakresowych.

Indeks zakresowy bloków (BRIN)

Indeksy BRIN grupują wartości kolumn w zakresy stron, działając optymalnie z naturalnie posortowanymi danymi. Testy z wartościami start_year zmniejszyły rozmiar indeksu około 19-krotnie. Czas wykonania nieznacznie wzrósł, pozwalając wyważyć szybkość i zużycie miejsca na dysku za pomocą parametru pages_per_row.

Podsumowanie

Poza indeksami B-drzewa, PostgreSQL oferuje wyspecjalizowane typy indeksów dla konkretnych potrzeb optymalizacji. Skuteczna optymalizacja obejmuje szybkość wykonania, zarządzanie przestrzenią dyskową i użycie CPU. Programiści muszą wyważyć wydajność odczytu względem kosztów operacji zapisu, ponieważ wszystkie indeksy negatywnie wpływają na zapytania INSERT.

Powiązane artykuły