Spec-Zone.ru › MySQL 8.4

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 = constant на всех ключевых частях, которые встречаются перед key_col в индексе. В этом случае MySQL выполняет одно ключевое обращение для каждого MIN() или MAX() выражения и заменяет его константой. Если все выражения заменены константами, запрос возвращается сразу. Например:

    SELECT MIN(key_part2),MAX(key_part2)
      FROM tbl_name WHERE key_part1=10;
    
  • Для сортировки или группировки таблицы, если сортировка или группировка выполняется по левостороннему префиксу используемого индекса (например, ORDER BY key_part1, key_part2). Если все ключевые части следуют за DESC, ключ читается в обратном порядке. (Или, если индекс является индексом в порядке убывания, ключ читается в прямом порядке). См. раздел 10.2.1.16 «Оптимизация ORDER BY», раздел 10.2.1.17 «Оптимизация GROUP BY» и раздел 10.3.13 «Индексы в порядке убывания».

  • В некоторых случаях запрос может быть оптимизирован для извлечения значений без обращения к строкам данных. (Индекс, который предоставляет все необходимые результаты для запроса, называется .). Если запрос использует только столбцы из таблицы, которые включены в какой-либо индекс, выбранные значения могут быть извлечены из дерева индекса для большей скорости:

    SELECT key_part3 FROM tbl_name
      WHERE key_part1=1
    

Индексы менее важны для запросов к небольшим таблицам или большим таблицам, где запросы отчетов обрабатывают большинство или все строки. Когда запрос должен получить доступ к большинству строк, последовательное чтение быстрее, чем работа с индексом. Последовательное чтение минимизирует поиск по диску, даже если не все строки необходимы для запроса. Подробности см. в разделе 10.2.1.23 «Избегание полного сканирования таблицы».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/mysql-indexes.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API