První věc, kterou je třeba si uvědomit, je, že MySQL používá pouze jeden index na pseudo-SELECT (nikoli příkaz) – když si prohlížíte výstup SELECT pomocí EXPLAIN, uvidíte, který index byl vybrán. EXPLAIN lze spustit pouze na SELECTS, takže musíme předpokládat, že DELETE/UPDATE používá stejný plán, když vyměníte syntaxi pro SELECT...
Většina databází (vestavěné mohou být liché) podle mých znalostí podporuje použití indexů v následujících klauzulích:
- VYBRAT
- JOIN (syntaxe ANSI-92)
- KDE (protože existuje ANSI-89 a filtrace zde)
- HAVING (WHERE ekvivalentní, ale na rozdíl od WHERE – umožňuje agregované použití bez nutnosti poddotazu)
- OBJEDNEJTE PODLE
Nejsem 100% na GROUP BY, takže to prozatím vynechávám.
Nakonec je to volba optimalizátorů pro to, co použít, na základě jeho algoritmu a statistik, které má po ruce. Můžete použít syntaxi ANALYZE TABLE pro obnovení statistik (pravidelně, ne neustále).
Dodatek
MySQL také omezuje množství prostoru pro alokaci indexů – 1 000 bajtů pro tabulky MyISAM a 767 bajtů pro tabulky InnoDB . Vzhledem k tomu, že MySQL používá pouze jeden index na psuedo-SELECT, pokrývání indexů (indexy, které obsahují více než jeden sloupec) je dobrý nápad, ale ve skutečnosti jde o testování nejběžnějšího dotazu a jeho co nejlepší optimalizaci. Priorita indexování by měla být:
- Primární klíč (někde ve verzi 5 se vytváření indexu pro pk stalo automatickým)
- Cizí klíče (další nejpravděpodobnější kandidát JOIN
- Kritéria filtrování (za předpokladu, že máte prostor)