Първото нещо, което трябва да знаете е, че MySQL използва само един индекс на псевдо-SELECT (не оператор) - когато преглеждате изхода на SELECT с помощта на EXPLAIN, ще видите кой индекс е избран за. EXPLAIN може да се изпълнява само на SELECTS, така че трябва да приемем, че DELETE/UPDATE използва същия план, когато разменяте синтаксиса за SELECT...
Повечето бази данни (вградените могат да бъдат странни), доколкото знам, поддържат използването на индекси в следните клаузи:
- ИЗБЕРЕТЕ
- JOIN (синтаксис ANSI-92)
- КЪДЕ (защото има и ANSI-89 и филтриране тук)
- HAVING (WHERE еквивалент, но за разлика от WHERE - позволява обобщена употреба без нужда от подзаявка)
- ПОРЪЧАЙТЕ ОТ
Не съм 100% за GROUP BY, така че за момента го пропускам.
В крайна сметка това е изборът на оптимизатора за това какво да се използва въз основа на неговия алгоритъм и статистиката, която има на разположение. Можете да използвате синтаксис ANALYZE TABLE за опресняване на статистиката (периодично, не постоянно, моля).
Допълнение
MySQL също така ограничава количеството пространство за разпределяне на индекси - 1000 байта за MyISAM таблици и 767 байта за InnoDB таблици . Тъй като MySQL използва само един индекс на psuedo-SELECT, покриващите индекси (индекси, които включват повече от една колона) са добра идея, но наистина става дума за тестване на най-често срещаната заявка и оптимизиране за нея възможно най-добре. Приоритетът на индексиране трябва да бъде:
- Първичен ключ (някъде във v5 създаването на индекс за pk стана автоматично)
- Външни ключове (следващият най-вероятен JOIN кандидат
- Критерии за филтриране (при положение, че имате място)