Indeksy w bazach danych. Rodzaje indeksów.

Bazy danych
Oleksandr Vykhor
11-03-2025 14:48:24


Indeksy w bazach danych są używane do przyspieszenia wyszukiwania i pobierania danych. Działają podobnie do spisów treści w książce, umożliwiając szybki dostęp do potrzebnych rekordów bez skanowania całej tabeli. Główne cele stosowania indeksów:

1. Przyspieszenie wyszukiwania. Indeksy pozwalają szybko znajdować wiersze spełniające określone warunki zapytania (np. `WHERE`).

2. Optymalizacja sortowania i grupowania. Jeśli zapytanie zawiera operacje `ORDER BY` lub `GROUP BY`, indeksy pomagają przyspieszyć ich wykonanie.

3. Przyspieszenie łączenia (JOIN). Podczas łączenia tabel indeksy pomagają szybko znajdować pasujące wiersze w powiązanych tabelach.

4. Zapewnienie unikalności. Unikalne indeksy gwarantują brak zduplikowanych wartości w kolumnie lub grupie kolumn.

5. Zwiększenie wydajności. Indeksy zmniejszają liczbę operacji wejścia/wyjścia (I/O), co jest szczególnie istotne dla dużych tabel.

Jednak indeksy mają także wady:

  • Dodatkowe zużycie pamięci. Indeksy zajmują dodatkowe miejsce na dysku.
  • Obciążenie operacji modyfikacji. Podczas wstawiania, aktualizacji lub usuwania danych indeksy muszą być aktualizowane, co może spowolnić te operacje.

Dlatego indeksy należy tworzyć, uwzględniając konkretne zapytania i obciążenie bazy danych, aby osiągnąć optymalną równowagę między wydajnością a kosztami utrzymania.

Rodzaje indeksów.

W bazach danych istnieje kilka rodzajów indeksów, z których każdy jest przeznaczony do określonych zastosowań. Podstawowe typy indeksów:

1. Indeksy jednokolumnowe

  • Tworzone dla jednej kolumny tabeli.
  • Odpowiednie do przyspieszenia wyszukiwania po jednej kolumnie.

Przykład: `CREATE INDEX idx_name ON users (name);`

2. Indeksy złożone

  • Tworzone dla kilku kolumn.
  • Przydatne w zapytaniach filtrujących lub sortujących dane według wielu kolumn.
  • Kolejność kolumn w indeksie ma znaczenie: zapytania powinny korzystać z prefiksu indeksu (np. jeśli indeks jest utworzony na `(col1, col2)`, zapytania filtrujące tylko po `col1` będą używać indeksu, ale zapytania tylko po `col2` już nie).

Przykład: `CREATE INDEX idx_name_age ON users (name, age);`

3. Indeksy unikalne

  • Gwarantują, że wszystkie wartości w indeksowanej kolumnie (lub grupie kolumn) są unikalne.
  • Używane do zapewnienia integralności danych.

Przykład: `CREATE UNIQUE INDEX idx_email ON users (email);`

4. Indeksy pełnotekstowe

  • Przeznaczone do wyszukiwania danych tekstowych (np. słów kluczowych lub fraz).
  • Obsługują zaawansowane zapytania wyszukiwania, takie jak wyszukiwanie według synonimów lub morfologii.

Przykład: `CREATE FULLTEXT INDEX idx_content ON articles (content);`

5. Indeksy przestrzenne

  • Używane do pracy z danymi geograficznymi (np. współrzędnymi, geometrią).
  • Optymalizują wyszukiwanie obiektów geograficznych.

Przykład: `CREATE SPATIAL INDEX idx_location ON places (coordinates);`

6. Indeksy haszujące

  • Wykorzystują funkcje haszujące do szybkiego wyszukiwania na podstawie dokładnych dopasowań.
  • Efektywne dla operacji `=`, ale nie nadają się do zapytań zakresowych (np. `BETWEEN`, `>`).

Przykład: `CREATE INDEX idx_hash ON users USING HASH (email);`

7. Indeksy B-drzewiaste

  • Najczęściej spotykany typ indeksów.
  • Obsługują zapytania zakresowe (np. `>`, `<`, `BETWEEN`), a także dokładne dopasowania.

Przykład: `CREATE INDEX idx_btree ON users (age);`

8. Indeksy bitowe

  • Stosowane dla kolumn z niewielką liczbą unikalnych wartości (np. płeć, status).
  • Efektywne dla operacji `AND`, `OR` i `NOT`.

Przykład: `CREATE BITMAP INDEX idx_status ON orders (status);`

9. Indeksy klastrowane

  • Określają fizyczny porządek danych w tabeli.
  • Każda tabela może mieć tylko jeden indeks klastrowany.

Przykład: W MySQL klucz główny (`PRIMARY KEY`) automatycznie tworzy indeks klastrowany.

10. Indeksy nieklastrowane

  • Tworzą oddzielną strukturę danych, która wskazuje na wiersze w tabeli.
  • Tabela może mieć wiele indeksów nieklastrowanych.

Przykład:`CREATE INDEX idx_nonclustered ON users (name);`

11. Indeksy częściowe

  • Indeksują tylko podzbiór danych spełniający określony warunek.
  • Przydatne w przypadku dużych tabel, gdzie indeksowanie wszystkich wierszy jest nieefektywne.

Przykład: `CREATE INDEX idx_active_users ON users (name) WHERE status = 'active';`

12. Indeksy funkcjonalne

  • Indeksują wynik funkcji zastosowanej do kolumny.
  • Przydatne w zapytaniach, które filtrują lub sortują dane na podstawie wyników funkcji.

Przykład: `CREATE INDEX idx_lower_name ON users (LOWER(name));`

13. Indeksy pokrywające

  • Zawierają wszystkie niezbędne dane do wykonania zapytania, co pozwala uniknąć odwołań do samej tabeli.

Przykład: `CREATE INDEX idx_covering ON users (id, name, age);`(jeśli zapytanie wybiera tylko te kolumny).

14. Indeksy na wyrażeniach

  • Podobne do indeksów funkcjonalnych, ale mogą zawierać bardziej złożone wyrażenia.

Przykład: `CREATE INDEX idx_expr ON orders (total_price * quantity);`

15. Indeksy dla tablic (GIN, GiST, BRIN)

  • Stosowane w PostgreSQL do obsługi tablic, JSON, wyszukiwania pełnotekstowego i innych złożonych typów danych.

Przykład: `CREATE INDEX idx_gin ON documents USING GIN (tags);`

Wybór odpowiedniego typu indeksu zależy od struktury danych, typów zapytań i wymagań dotyczących wydajności. Niewłaściwe użycie indeksów może obniżyć wydajność, dlatego ważne jest analizowanie zapytań i testowanie ich wpływu na bazę danych.


Назад