Pierwszą rzeczą, o której należy pamiętać, jest to, że MySQL używa tylko jednego indeksu na pseudo-SELECT (nie na instrukcję) - kiedy przeglądasz wynik SELECT za pomocą EXPLAIN, zobaczysz, który indeks został wybrany dla. EXPLAIN można uruchomić tylko na SELECTS, więc musimy założyć, że DELETE/UPDATE używa tego samego planu, gdy zamieniasz składnię na SELECT...
Większość baz danych (osadzone mogą być dziwne) według mojej wiedzy obsługuje indeksy w następujących klauzulach:
- WYBIERZ
- DOŁĄCZ (składnia ANSI-92)
- GDZIE (ponieważ istnieje zarówno ANSI-89 i filtrowanie tutaj)
- HAVING (odpowiednik WHERE, ale w przeciwieństwie do WHERE - umożliwia agregowanie użycia bez konieczności podzapytania)
- ZAMÓW PRZEZ
Nie jestem w 100% na GROUP BY, więc na razie go pomijam.
Ostatecznie jest to wybór optymalizatorów, których użyć, w oparciu o jego algorytm i statystyki, które ma pod ręką. Możesz użyć składni TABELA ANALIZY aby odświeżyć statystyki (okresowo, a nie ciągle).
Uzupełnienie
MySQL ogranicza również ilość miejsca przeznaczonego na przydzielanie indeksów - 1000 bajtów dla tabel MyISAM i 767 bajtów dla tabel InnoDB . Ponieważ MySQL używa tylko jednego indeksu na pseudo-SELECT, pokrycie indeksów (indeksów zawierających więcej niż jedną kolumnę) jest dobrym pomysłem, ale tak naprawdę chodzi o testowanie najczęstszych zapytań i optymalizację pod kątem jak najlepiej. Priorytet indeksowania powinien być następujący:
- Klucz podstawowy (gdzieś w wersji 5, tworzenie indeksu dla pk stało się automatyczne)
- Klucze obce (kolejny najprawdopodobniej kandydat DOŁĄCZ )
- Kryteria filtrowania (zakładając, że masz miejsce)