Индексы служат многим целям. Таблицы InnoDB всегда организованы в виде индекса для ключа кластера. Индексы могут использоваться для обеспечения уникальных ограничений, а также для поддержки ограничений внешнего ключа. Топи c «индексов» охватывает гораздо больше, чем производительность запросов.
С точки зрения производительности запросов, это действительно зависит от того, что делает запрос. Если мы выбираем небольшое подмножество строк из большого набора, эффективное использование индекса может ускорить это, исключая проверку огромных рядов строк. Отсюда и самый большой взрыв.
Если мы извлекаем все строки или почти все строки из набора, то индекс обычно не помогает сузить, какие строки проверять; даже когда индекс доступен, оптимизатор может выбрать полное сканирование всех строк.
Но даже при извлечении больших подмножеств соответствующие индексы могут повысить производительность операций объединения и значительно повысить производительность запросы с предложениями GROUP BY или ORDER BY, используя индекс для извлечения строк по порядку, а не требуя операции «Использование файловой сортировки».
Если мы ищем простое правило большого пальца ... для большого набора, если нам нужно вытащить (или посмотреть) менее 10% от общего числа строк, тогда план доступа, использующий подходящий индекс, обычно превосходит полное сканирование. Если мы ищем определенную строку c, основанную на уникальном идентификаторе, индекс будет быстрее, чем полное сканирование. Если мы извлекаем все столбцы для каждой строки таблицы без определенного порядка, тогда полное сканирование будет быстрее.
Опять же, все сводится к тому, какие операции выполняются. Какие запросы выполняются, и профиль производительности, который нам нужен из этих запросов. Это будет ключом к определению стратегии индексации.
С точки зрения понимания, используйте EXPLAIN
, чтобы увидеть план выполнения. Изучите операции, доступные оптимизатору MySQl.
(Топика c стратегии индексации с точки зрения производительности базы данных слишком велика для вопроса StackOverflow.)