10.3.1 Как MySQL использует индексы
Индексы используются для быстрого поиска строк со значениями определенных столбцов. Без индекса MySQL должно начинать с первой строки и затем читать всю таблицу, чтобы найти соответствующие строки. Чем больше таблица, тем больше это стоит. Если таблица имеет индекс для столбцов, о которых идет речь, MySQL может быстро определить позицию для поиска в середине файла данных, не просматривая все данные. Это намного быстрее, чем последовательное чтение каждой строки.
Большинство индексов MySQL (PRIMARY KEY, UNIQUE, INDEX и FULLTEXT) хранятся в . Исключения: индексы на пространственных типах данных используют R-деревья; таблицы MEMORY также поддерживают ; InnoDB использует инвертированные списки для FULLTEXT индексов.
В общем случае индексы используются, как описано в последующем обсуждении. Характеристики, специфичные для индексов хеширования (как используемых в таблицах MEMORY), описаны в разделе 10.3.9 «Сравнение B-дерева и индексов хеширования».
MySQL использует индексы для этих операций:
Для быстрого поиска строк, соответствующих условию
WHERE.Для исключения строк из рассмотрения. Если есть выбор между несколькими индексами, MySQL обычно использует индекс, который находит наименьшее количество строк (наиболее индекс).
Если таблица имеет индекс из нескольких столбцов, любой левосторонний префикс индекса может быть использован оптимизатором для поиска строк. Например, если у вас есть трехстолбцовый индекс по
(col1, col2, col3), у вас есть возможности поиска по(col1),(col1, col2)и(col1, col2, col3). Для получения дополнительной информации см. раздел 10.3.6 «Индексы из нескольких столбцов».-
Для извлечения строк из других таблиц при выполнении объединений. MySQL может более эффективно использовать индексы на столбцах, если они объявлены одного типа и размера. В этом контексте
VARCHARиCHARсчитаются одинаковыми, если они объявлены одного размера. Например,VARCHAR(10)иCHAR(10)имеют одинаковый размер, ноVARCHAR(10)иCHAR(15)нет.Для сравнения столбцов строковых данных без учёта кодировки, оба столбца должны использовать один и тот же набор символов. Например, сравнение столбца
utf8mb4со столбцомlatin1не позволяет использовать индекс.Сравнение несхожих столбцов (например, сравнение строчного столбца со временным или числовым столбцом) может препятствовать использованию индексов, если значения нельзя сравнить напрямую без преобразования. Для заданного значения, например,
1в числовом столбце, оно может быть равно одному из многих значений в строковом столбце, например,'1',' 1','00001'или'01.e1'. Это исключает использование индексов для строчного столбца. -
Для нахождения значения
MIN()илиMAX()для конкретного индексированного столбцаkey_col. Это оптимизируется препроцессором, который проверяет, используете ли выWHEREна всех ключевых частях, которые встречаются передkey_part_N=constantkey_colв индексе. В этом случае MySQL выполняет одно ключевое обращение для каждогоMIN()илиMAX()выражения и заменяет его константой. Если все выражения заменены константами, запрос возвращается сразу. Например:SELECT MIN(
key_part2),MAX(key_part2) FROMtbl_nameWHEREkey_part1=10; Для сортировки или группировки таблицы, если сортировка или группировка выполняется по левостороннему префиксу используемого индекса (например,
ORDER BY). Если все ключевые части следуют заkey_part1,key_part2DESC, ключ читается в обратном порядке. (Или, если индекс является индексом в порядке убывания, ключ читается в прямом порядке). См. раздел 10.2.1.16 «Оптимизация ORDER BY», раздел 10.2.1.17 «Оптимизация GROUP BY» и раздел 10.3.13 «Индексы в порядке убывания».-
В некоторых случаях запрос может быть оптимизирован для извлечения значений без обращения к строкам данных. (Индекс, который предоставляет все необходимые результаты для запроса, называется .). Если запрос использует только столбцы из таблицы, которые включены в какой-либо индекс, выбранные значения могут быть извлечены из дерева индекса для большей скорости:
SELECT
key_part3FROMtbl_nameWHEREkey_part1=1
Индексы менее важны для запросов к небольшим таблицам или большим таблицам, где запросы отчетов обрабатывают большинство или все строки. Когда запрос должен получить доступ к большинству строк, последовательное чтение быстрее, чем работа с индексом. Последовательное чтение минимизирует поиск по диску, даже если не все строки необходимы для запроса. Подробности см. в разделе 10.2.1.23 «Избегание полного сканирования таблицы».
© 2025 Oracle
Licensed under the GPLv2 License.