8.2.1.20 Избегание полных сканирований таблицы
Вывод из EXPLAIN показывает ALL в столбце type, когда MySQL использует полное сканирование таблицы для разрешения запроса. Это обычно происходит в следующих условиях:
Таблица настолько мала, что сканирование таблицы быстрее, чем поиск по ключу. Это часто встречается для таблиц с менее чем 10 строками и небольшой длиной строки.
В предложении WHERE или
ONнет полезных ограничений для индексированных столбцов.Вы сравниваете индексированные столбцы со значениями константами, и MySQL рассчитал (на основе дерева индекса), что константы охватывают слишком большую часть таблицы и сканирование таблицы будет быстрее. См. Раздел 8.2.1.1, «Оптимизация предложения WHERE».
Вы используете ключ с низкой кардинальностью (многие строки соответствуют значению ключа) через другой столбец. В этом случае MySQL предполагает, что использование ключа может привести к множеству поисков по ключу, и сканирование таблицы будет быстрее.
Для небольших таблиц сканирование таблицы часто является приемлемым вариантом, и влияние на производительность незначительно. Для больших таблиц попробуйте следующие методы, чтобы избежать неправильного выбора оптимизатором сканирования таблицы:
Используйте
ANALYZE TABLEдля обновления распределения ключей для сканируемой таблицы. См. Раздел 13.7.2.1, «Выполнение ANALYZE TABLE».tbl_name-
Используйте
FORCE INDEXдля сканируемой таблицы, чтобы указать MySQL, что сканирование таблицы значительно дороже, чем использование данного индекса:SELECT * FROM t1, t2 FORCE INDEX (
index_for_column) WHERE t1.col_name=t2.col_name; Запустите mysqld с параметром
--max-seeks-for-key=1000или используйтеSET max_seeks_for_key=1000, чтобы сообщить оптимизатору, что ни один поиск по ключу не вызывает более 1000 обращений к ключу. См. Раздел 5.1.7, «Системные переменные сервера».
© 2025 Oracle
Licensed under the GPLv2 License.