Tworzenie indeksów w bazie danych ma na celu poprawę szybkości dostępu do danych. Indeksy są obiektami, które nie są związane fizycznie z tabelą na którą są nałożone. Reprezentują one specjalne tabele wyszukujące, które pozwalają przyśpieszyć proces zwracania danych. Są to, swojego rodzaju, wskaźniki do danych zawartych w tabeli. W największym uproszczeniu – mechanizm ten jest podobny do spisu treści książki.
Indeksy pozwalają na przyśpieszenie zapytań SELECT oraz klauzuli WHERE. Wpływają jednak na spowolenienie dodawania oraz aktualizowania danych istniejących, tj. INSERT oraz UPDATE.
Pamiętajcie, że indeksy mogą być tworzone lub usuwane bez wpływu na zbiór istniejących danych. Tworzenie indeksu odbywa się za pomocą polecenia CREATE INDEX, które pozwala zdefiniować nazwę indeksu, tabelę oraz kolumnę/kolumny do indeksowania oraz określić czy indeks zdefiniowany jest w porządku rosnącym czy malejącym. Domyślnym zachowaniem jest tworzenie indeksów w porządku rosnącym.
Kasowanie indeksów odbywa się przy pomocy polecenia DELETE INDEX wraz z podaniem nazwy istniejącego indeksu.
Zanim przejdziemy dalej – indeksy mogą być również unikalne. Tutaj wykorzystamy polecenie CREATE UNIQUE INDEX, które zapewnia unikalność wartości w danej kolumnie lub kombinacji kilku kolumn na które został nałożony indeks.
To tyle jeżeli chodzi o teorię – zobaczmy jak wygląda tworzenie/kasowanie indeksów w praktyce.
Tworzenie indeksów
Podstawowa składnia tworzenia indeksu prezentuje się w poniższy sposób:
CREATE INDEX nazwa_indeksu ON nazwa_tabeli;
Tak jak wspomniałem powyżej, indeks możemy nałożyć na jedną kolumnę:
CREATE INDEX nazwa_indeksu
ON nazwa_tabeli (nazwa_kolumny);
lub zdefiniować indeks złożony nakładany na dwie lub więcej kolumn danej tabeli:
CREATE INDEX nazwa_indeksu
ON nazwa_tabeli (nazwa_kolumny_1, nazwa_kolumny_2)
Jaka jest podstawowa zasada tworzenia indeksów (niezależnie czy tworzymy indeks jednokolumnowy czy złożony)? Warto przeanalizować nasze zapytania a w szczególności klauzulę WHERE i kolumnę/kolumny po których dokonujemy filtrowania – takie podejście ułatwi nam ostateczną decyzję na które kolumny nałożyć indeksy.
Nie możemy zapominać również o indeksie unikalnym, który poza poprawą wydajności wpływa na integralność danych nie pozwalając na wstawienie żadnych duplikatów wartości. Składnia polecenia została zaprezentowana poniżej:
CREATE UNIQUE INDEX nazwa_indeksu
ON nazwa_tabeli (nazwa_kolumny)
Kasowanie indeksów
Podstawowa składnia kasowania indeksu prezentuje się w poniższy sposób:
DROP INDEX nazwa_indeksu
Wykonanie powyższego polecenia powinno być dokładnie przemyślane ponieważ może wpłynąć na pogorszenie lub poprawę wydajności naszej bazy danych.
Czy zawsze używać indeksów?
Głównym założeniem użycia indeksów jest zwiększenie wydajności bazy danych. Ich nieumiejętne wykorzystanie może jednak doprowadzić do efektów całkowicie odwrotnych. Musimy zatem wspomnieć kiedy powinniśmy ich unikać:
w przypadku małych tabel;
w przypadku tabel na których dokonujemy częstego wstawiania bądź aktualizowania rekordów;
w przypadku kolumn zawierających dużą liczbę wartości NULL;
w przypadku kolumn, których wartości są często zmieniane.
Zanim zakończymy ten wpis. Indeksy nie są jedynym sposobem na poprawę wydajności baz danych. Równie istotny jest schemat bazy danych przygotowany z punktu widzenia operacji transakcyjnych. Odpowiednio przygotowany pozwala na zmniejszenie ilości blokad (locking mechanism) - mechanizm ten jest podstawową ideą zapewniającą spójność danych. Sama konfiguracja bazy danych jest również niezwykle istotna a poprawne wykorzystanie parametrów środowiskowych wpłynie pozytywnie na wydajność całej bazy danych.
Powyższe punkty nie są jednak tematem tego wpisu – chciałem jednak pozostawić informację dla osób dociekliwych, które chcą zagłębić się dalej w ten temat. Rozwiązania te są zwykle wdrażane przez osoby dedykowane do pracy z bazami danych – dodatkowa wiedza (nawet na poziomie podstawowym) jeszcze nikomu nie zaskodziła – może być wykorzystana w naszych amatorskich projektach