Indeksy mogą odgrywać ważną rolę w optymalizacji zapytań i szybkim wyszukiwaniu wyników z tabel. Dlatego najważniejszym krokiem jest wybranie kolumn do indeksowania. Istnieją dwa główne miejsca, w których możemy rozważyć indeksowanie:kolumny, do których odwołuje się klauzula WHERE, oraz kolumny używane w klauzulach JOIN. W skrócie, powinny być indeksowane takie kolumny, według których wymagane jest przeszukiwanie poszczególnych rekordów. Załóżmy, że mamy tabelę o nazwie kupujący, w której zapytanie SELECT używa indeksów takich jak poniżej:
SELECT
buyer_id /* no need to index */
FROM buyers
WHERE first_name='Tariq' /* consider to use index */
AND last_name='Iqbal' /* consider to use index */
Ponieważ w części SELECT występuje odwołanie do „buyer_id”, MySQL nie użyje go do ograniczenia wybranych wierszy. Dlatego nie ma wielkiej potrzeby indeksowania go. Poniżej znajduje się kolejny przykład nieco różniący się od powyższego:
SELECT
buyers.buyer_id, /* no need to index */
country.name /* no need to index */
FROM buyers LEFT JOIN country
ON buyers.country_id=country.country_id /* consider to use index */
WHERE
first_name='Tariq' /* consider to use index */
AND
last_name='Iqbal' /* consider to use index */
Zgodnie z powyższymi zapytaniami kolumny first_name, last_name mogą być indeksowane, ponieważ znajdują się w klauzuli WHERE. Do indeksowania można również rozważyć dodatkowe pole country_id z tabeli krajów, ponieważ znajduje się ono w klauzuli JOIN. Tak więc indeksowanie można rozważyć w każdym polu w klauzuli WHERE lub klauzuli JOIN.
Poniższa lista zawiera również kilka wskazówek, o których zawsze należy pamiętać, gdy zamierzasz tworzyć indeksy w swoich tabelach:
- Indeksuj tylko te kolumny, które są wymagane w klauzulach WHERE i ORDER BY. Obfite indeksowanie kolumn spowoduje pewne wady.
- Spróbuj skorzystać z funkcji „prefiksu indeksu” lub „indeksu wielokolumnowego” w MySQL. Jeśli tworzysz indeks, taki jak INDEX(imię, nazwisko), nie twórz INDEX(imię). Jednak „prefiks indeksu” lub „indeks wielokolumnowy” nie są zalecane we wszystkich przypadkach wyszukiwania.
- Użyj atrybutu NOT NULL dla tych kolumn, w których rozważasz indeksowanie, aby wartości NULL nigdy nie były przechowywane.
- Użyj opcji --log-long-format, aby rejestrować zapytania, które nie używają indeksów. W ten sposób możesz sprawdzić ten plik dziennika i odpowiednio dostosować swoje zapytania.
- Instrukcja EXPLAIN pomaga ujawnić, w jaki sposób MySQL wykona zapytanie. Pokazuje jak iw jakiej kolejności łączone są stoły. Może to być bardzo przydatne do określenia, jak pisać zoptymalizowane zapytania i czy kolumny są potrzebne do indeksowania.
Aktualizacja (23 lutego 2015):
Każdy indeks (dobry/zły) wydłuża czas wstawiania i aktualizacji.
W zależności od Twoich indeksów (ilości indeksów i rodzaju) przeszukiwany jest wynik. Jeśli Twój czas wyszukiwania wydłuży się z powodu indeksu, to jest to zły indeks.
Prawdopodobnie w każdej książce, "Strona indeksu" może mieć początek rozdziału, strony z numerami tematów, a także strony z podtematami. Pewne wyjaśnienia na stronie Indeks pomagają, ale bardziej szczegółowy indeks może Cię zmylić lub przestraszyć. Indeksy też mają pamięć.
Wybór indeksu powinien być mądry. Pamiętaj, że nie wszystkie kolumny wymagają indeksu.