Spec-Zone.ru › MySQL 5.7

8.2.1.20 Избегание полных сканирований таблицы

Вывод из EXPLAIN показывает ALL в столбце type, когда MySQL использует полное сканирование таблицы для разрешения запроса. Это обычно происходит в следующих условиях:

  • Таблица настолько мала, что сканирование таблицы быстрее, чем поиск по ключу. Это часто встречается для таблиц с менее чем 10 строками и небольшой длиной строки.

  • В предложении WHERE или ON нет полезных ограничений для индексированных столбцов.

  • Вы сравниваете индексированные столбцы со значениями константами, и MySQL рассчитал (на основе дерева индекса), что константы охватывают слишком большую часть таблицы и сканирование таблицы будет быстрее. См. Раздел 8.2.1.1, «Оптимизация предложения WHERE».

  • Вы используете ключ с низкой кардинальностью (многие строки соответствуют значению ключа) через другой столбец. В этом случае MySQL предполагает, что использование ключа может привести к множеству поисков по ключу, и сканирование таблицы будет быстрее.

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

  • Используйте ANALYZE TABLE tbl_name для обновления распределения ключей для сканируемой таблицы. См. Раздел 13.7.2.1, «Выполнение ANALYZE TABLE».

  • Используйте FORCE INDEX для сканируемой таблицы, чтобы указать MySQL, что сканирование таблицы значительно дороже, чем использование данного индекса:

    SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
      WHERE t1.col_name=t2.col_name;
    

    См. Раздел 8.9.4, «Подсказки индексов».

  • Запустите mysqld с параметром --max-seeks-for-key=1000 или используйте SET max_seeks_for_key=1000, чтобы сообщить оптимизатору, что ни один поиск по ключу не вызывает более 1000 обращений к ключу. См. Раздел 5.1.7, «Системные переменные сервера».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/table-scan-avoidance.html

Spec-Zone.ru

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