Sobes.tech
Junior

W jakich przypadkach używa się indeksów w bazach danych?

sobes.tech AI

Odpowiedź od AI

Indeksy w bazach danych służą do optymalizacji szybkości wykonywania zapytań, w szczególności:

  • Wyszukiwanie danych: Przyspieszenie operacji SELECT, szczególnie z warunkami WHERE, JOIN i ORDER BY. Indeks pozwala systemowi zarządzania bazą danych (DBMS) szybciej znaleźć potrzebne wiersze, bez skanowania całej tabeli.
  • Sortowanie: Przyspieszenie sortowania za pomocą ORDER BY. Jeśli kolumny sortowania mają indeks, DBMS może z niego skorzystać, unikając dodatkowych operacji sortowania.
  • Łączenie tabel: Przyspieszenie operacji JOIN na indeksowanych kolumnach. Indeks pomaga szybko znaleźć odpowiadające wiersze w powiązanych tabelach.
  • Unikalność danych: Gwarancja unikalności wartości w kolumnie (poprzez indeks unikalny).
  • Klucze główne: Klucz główny domyślnie jest indeksem unikalnym i służy do szybkiego dostępu do wiersza po unikalnym identyfikatorze.
  • Klucze obce: Używane do zapewnienia integralności referencyjnej i przyspieszania operacji JOIN między powiązanymi tabelami.

Przykłady kolumn do indeksowania:

  • Kolumny, po których często się wyszukuje (WHERE uid = 123).
  • Kolumny używane w warunkach JOIN (table1.id = table2.ref_id).
  • Kolumny, które często są sortowane (ORDER BY created_at DESC).
  • Kolumny o wysokiej kardynalności (wiele unikalnych wartości).

Przypadki, gdy indeksy mogą być nieefektywne lub niepotrzebne:

  • Bardzo małe tabele: W małych tabelach skanowanie może być szybsze lub porównywalne z wyszukiwaniem za pomocą indeksu.
  • Kolumny o niskiej kardynalności: Indeks na kolumnie z małą liczbą unikalnych wartości (np. pole boolean TRUE/FALSE) może nie przynieść znaczącego przyspieszenia.
  • Częste operacje zapisu (INSERT, UPDATE, DELETE): Indeksy wymagają aktualizacji przy zmianie danych, co może spowolnić operacje zapisu. Nie zaleca się indeksowania wszystkich kolumn bezmyślnie.
  • Kolumny w warunkach WHERE z funkcjami: Jeśli funkcja jest stosowana do kolumny w WHERE (np. WHERE YEAR(date_column) = 2023), zwykły indeks na date_column nie będzie używany. Potrzebny jest indeks funkcjonalny (jeśli obsługiwany przez DBMS) lub przebudowa zapytania.