10.2.1.23 Избегание полных сканирований таблиц
Вывод из EXPLAIN показывает ALL в столбце type, когда MySQL использует полное сканирование таблицы для решения запроса. Это обычно происходит в следующих условиях:
Таблица настолько мала, что полное сканирование таблицы быстрее, чем поиск по ключу. Это характерно для таблиц с менее чем 10 строками и короткими строками.
В предложении
ONилиWHEREнет полезных ограничений для индексированных столбцов.Вы сравниваете индексированные столбцы со значениями констант, и MySQL рассчитал (на основе дерева индекса), что константы охватывают слишком большую часть таблицы, и полное сканирование будет быстрее. См. Раздел 10.2.1.1, «Оптимизация предложения WHERE».
Вы используете ключ с низкой кардинальностью (много строк соответствует значению ключа) через другой столбец. В этом случае MySQL предполагает, что использование ключа, вероятно, потребует многих поисков по ключу, и полное сканирование будет быстрее.
Для небольших таблиц полное сканирование часто подходит, и влияние на производительность незначительно. Для больших таблиц попробуйте следующие методы, чтобы избежать неправильного выбора оптимизатором полного сканирования таблицы:
Используйте
ANALYZE TABLEдля обновления распределения ключей для сканируемой таблицы. См. Раздел 15.7.3.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 поисков по ключу. См. Раздел 7.1.8, «Переменные системы сервера».
© 2025 Oracle
Licensed under the GPLv2 License.