Системная переменная MAX_SEEKS_FOR_KEY в MySQL управляет порогом, связанным с процессом принятия решений оптимизатором при выборе использования индексного сканирования или полного сканирования таблицы. Установка MAX_SEEKS_FOR_KEY Слишком высокое несет несколько рисков, которые могут повлиять на производительность и эффективность запросов в базе данных MySQL.
max_seeks_for_key представляет предполагаемое максимальное количество ключей, идущих на оптимизатор, ожидая при поиске строки на основе индексного ключа. По умолчанию это значение чрезвычайно высокое (на 64-разрядной системе, как правило, он устанавливается на 18 446 744 073 709 551 615). Это означает, что оптимизатор не будет ограничивать себя, предполагая, насколько дорогой может быть поиск ключей по индексу.
Когда MAX_SEEKS_FOR_KEY установлен очень высоким, оптимизатор предпочитает сканирование таблицы по сравнению с индексом, особенно в тех случаях, когда кардинальность индекса (предполагаемое количество уникальных значений в индексе) относительно низкая. Это может привести к нескольким нежелательным последствиям:
1. Субоптимальные планы запросов:
Наиболее значительным риском высокого уровня max_seeks_for_key является то, что оптимизатор запросов может выбрать полные сканирования таблицы вместо более эффективных сканирований индекса. Постоянные сканирования таблицы считывают каждую строку в таблице последовательно, что может привести к более высоким затратам ввода/вывода, если таблица большая, а запрос нуждается только в небольшом подмножестве строк. Это приводит к более медленному времени выполнения запросов по сравнению с использованием соответствующего индексного сканирования.
2. Увеличение использования ресурсов и задержки:
Полное сканирование таблицы часто потребляет больше ресурсов CPU и диска ввода -вывода, потому что каждая строка в таблице должна быть изучена. Это может способствовать общей системной нагрузке, увеличить задержку для запросов и снизить пропускную способность для сервера MySQL, особенно при высокой параллелизме пользователей или с очень большими наборами данных.
3. Плохая производительность на больших таблицах:
Поскольку полное сканирование требует чтения всей таблицы, устанавливает MAX_SEEKS_FOR_KEY СЛИШКОМ ВЫСОКИМЫЕ ЭКСПОРТИВАНИЯ ОГРАНИЧЕНИЯ для больших таблиц со многими рядами. Запросы, которые в идеале должны использовать индексы для быстрого фильтрации строк вместо этого, несут длительную продолжительность сканирования, снижая отзывчивость применения.
4. Неизвестное поведение между запросами:
Поскольку max_seeks_for_key применяется во всем мире, увеличение его значения влияет на все запросы на сервере. В то время как некоторые запросы могут выиграть от полного сканирования, многие другие оптимизированы для индексов, могут быть хуже. Это приносит непредсказуемость и противоречивую производительность запросов, требуя тщательных и постоянных экспериментов и настройки, специфичных для запросов.
5. Неспособность эффективно использовать индекс кардинальности:
Индекс Cardinality (оценка различных значений в индексе) является ключом к решениям оптимизатора MySQL. Если MAX_SEEKS_FOR_KEY установлен слишком высоко, оптимизатор оштрафовал индексные сканирования, предполагая, что им могут потребоваться более дорогие ключевые поиски, чем они на самом деле делают, даже если индексы высокой кардинальности должны быть логически использоваться. Следовательно, оптимизация на основе индексов недостаточно используется или игнорируется.
6. Вводящая в заблуждение статистика оптимизатора:
Оптимизатор зависит от статистики, такой как индекс кардинальности и затраты, связанные с поиском строк. Когда max_seeks_for_key маскирует фактическую стоимость, будучи чрезмерно допустившимся, это может привести к тому, что оптимизатор неправильно оценивает стоимость путей доступа, влияя на общую точность модели затрат оптимизатора.
7. Сложность устранения неполадок. Проблемы с производительностью:
Поскольку max_seeks_for_key может сложным взаимодействием со статистикой индекса и планами запросов, его установление слишком высокой может сделать диагностику медленных запросов более сложными. Это может привести к ситуациям, когда индексы настройки или переписывание запросов не дают ожидаемых улучшений, поскольку фундаментальные допущения затрат в оптимизаторе остаются искаженными.
Сводка рисков: установление MAX_SEEKS_FOR_KEY Слишком высокое приводит к тому, что оптимизатор MySQL предпочитает полные сканирования таблицы вместо сканирования индекса, что приводит к более медленному времени выполнения, увеличению нагрузки на ЦП и ввода/вывода, неэффективное использование индексов, деградированная производительность на больших таблицах, бессмысленное поведение запроса, оценок неразмешающих затрат под оптимизаторами и вызовы в создании.
Эти риски подчеркивают, почему многие DBA предпочитают уменьшить MAX_SEEKS_FOR_KEY на более умеренный уровень (например, 1000 или аналогичный). Снижение значения побуждает оптимизатор предпочитает использование индекса по поводу полного сканирования, когда индекс, кардинальность выше этого порога, обычно улучшая скорость запроса и снижение потребления ресурсов для типичных рабочих нагрузок.
В заключение, хотя очень высокий MAX_SEEKS_FOR_KEY может показаться безопасным, поскольку он не ограничивает оптимизатор, на практике он рискует плохая производительность запросов, потраченные впустую ресурсы и более высокую задержку из -за преждевременных полных сканирования таблицы, особенно на больших наборах данных, которые должны быть эффективно индексированы.