8.9.2 Переключаемые оптимизации
Переменная системы optimizer_switch позволяет управлять поведением оптимизатора. Её значение представляет собой набор флагов, каждый из которых имеет значение on или off, указывающее, включено или выключено соответствующее поведение оптимизатора. Эта переменная имеет глобальное и сессионное значения и может быть изменена во время выполнения. Глобальное значение по умолчанию может быть установлено при запуске сервера.
Чтобы увидеть текущий набор флагов оптимизатора, выберите значение переменной:
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
index_merge_sort_union=on,
index_merge_intersection=on,
engine_condition_pushdown=on,
index_condition_pushdown=on,
mrr=on,mrr_cost_based=on,
block_nested_loop=on,batched_key_access=off,
materialization=on,semijoin=on,loosescan=on,
firstmatch=on,duplicateweedout=on,
subquery_materialization_cost_based=on,
use_index_extensions=on,
condition_fanout_filter=on,derived_merge=on,
prefer_ordering_index=on
Чтобы изменить значение optimizer_switch, присвойте значение, состоящее из одного или нескольких команд, разделённых запятыми:
SET [GLOBAL|SESSION] optimizer_switch='command[,command]...';
Каждое значение command должно иметь один из форматов, показанных в следующей таблице.
| Синтаксис команды | Значение |
|---|---|
default | Сбросить каждую оптимизацию к её значению по умолчанию |
| Установить названную оптимизацию в её значение по умолчанию |
| Отключить названную оптимизацию |
| Включить названную оптимизацию |
Порядок команд в значении не имеет значения, хотя команда default выполняется первой, если она присутствует. Установка флага opt_name в значение default устанавливает его в то значение, которое является значением по умолчанию, либо on, либо off. Указание любого данного флага opt_name более одного раза в значении запрещено и приводит к ошибке. Любые ошибки в значении приводят к отказу присваивания с ошибкой, оставляя значение optimizer_switch неизменным.
В следующем списке описаны допустимые имена флагов opt_name, сгруппированные по стратегиям оптимизации:
-
Флаги пакетного доступа к ключам
-
batched_key_access(по умолчаниюoff)Управляет использованием алгоритма соединения BKA.
Для того, чтобы
batched_key_accessоказывал какое-либо влияние при установке вon, флагmrrтакже должен бытьon. В настоящее время оценка стоимости для MRR слишком пессимистична. Следовательно, также необходимо, чтобыmrr_cost_basedбылoffдля использования BKA.Для получения дополнительной информации см. Раздел 8.2.1.11, «Соединения Block Nested-Loop и пакетного доступа к ключам».
-
-
Флаги Block Nested-Loop
-
block_nested_loop(по умолчаниюon)Управляет использованием алгоритма соединения BNL.
Для получения дополнительной информации см. Раздел 8.2.1.11, «Соединения Block Nested-Loop и пакетного доступа к ключам».
-
-
Флаги фильтрации условий
-
condition_fanout_filter(по умолчаниюon)Управляет использованием фильтрации условий.
Для получения дополнительной информации см. Раздел 8.2.1.12, «Фильтрация условий».
-
-
Флаги слияния производных таблиц
-
derived_merge(по умолчаниюon)Управляет слиянием производных таблиц и представлений во внешний блок запроса.
Флаг
derived_mergeуправляет тем, пытается ли оптимизатор объединять производные таблицы и ссылки на представления во внешний блок запроса, предполагая, что ни одно другое правило не препятствует слиянию; например, директиваALGORITHMдля представления имеет приоритет над настройкойderived_merge. По умолчанию флаг установлен вonдля включения слияния.Для получения дополнительной информации см. Раздел 8.2.2.4, «Оптимизация производных таблиц и ссылок на представления с помощью слияния или материализации».
-
-
Флаги пересылки условий ядра
-
engine_condition_pushdown(по умолчаниюon)Управляет пересылкой условий ядра.
Для получения дополнительной информации см. Раздел 8.2.1.4, «Оптимизация пересылки условий ядра».
-
-
Флаги пересылки условий индекса
-
index_condition_pushdown(по умолчаниюon)Управляет пересылкой условий индекса.
Для получения дополнительной информации см. Раздел 8.2.1.5, «Оптимизация пересылки условий индекса».
-
-
Флаги расширений индексов
-
use_index_extensions(по умолчаниюon)Управляет использованием расширений индексов.
Для получения дополнительной информации см. Раздел 8.3.9, «Использование расширений индексов».
-
-
Флаги слияния индексов
-
index_merge(по умолчаниюon)Управляет всеми оптимизациями слияния индексов.
-
index_merge_intersection(по умолчаниюon)Управляет оптимизацией доступа к пересечению слияния индексов.
-
index_merge_sort_union(по умолчаниюon)Управляет оптимизацией доступа к сортировке-объединению слияния индексов.
-
index_merge_union(по умолчаниюon)Управляет оптимизацией доступа к объединению слияния индексов.
Для получения дополнительной информации см. Раздел 8.2.1.3, «Оптимизация слияния индексов».
-
-
Флаги оптимизации LIMIT
-
prefer_ordering_index(по умолчаниюon)Управляет тем, пытается ли оптимизатор использовать упорядоченный индекс вместо неупорядоченного индекса, сортировки файлов или какой-либо другой оптимизации в случае запроса с
ORDER BYилиGROUP BYс предложениемLIMIT. Эта оптимизация выполняется по умолчанию всякий раз, когда оптимизатор определяет, что ее использование позволит ускорить выполнение запроса.Поскольку алгоритм, который принимает это решение, не может обрабатывать все мыслимые случаи (отчасти из-за предположения, что распределение данных всегда более или менее равномерно), есть случаи, когда эта оптимизация может быть нежелательна. До MySQL 5.7.33 отключить эту оптимизацию было невозможно, но в MySQL 5.7.33 и более поздних версиях, хотя она остается поведением по умолчанию, ее можно отключить, установив флаг
prefer_ordering_indexвoff.
Для получения дополнительной информации и примеров см. Раздел 8.2.1.17, «Оптимизация запросов LIMIT».
-
-
Флаги многодиапазонного чтения
-
mrr(по умолчаниюon)Управляет стратегией многодиапазонного чтения.
-
mrr_cost_based(по умолчаниюon)Управляет использованием основанного на стоимости MRR, если
mrr=on.
Для получения дополнительной информации см. Раздел 8.2.1.10, «Оптимизация многодиапазонного чтения».
-
-
Флаги полусоединения
-
duplicateweedout(по умолчаниюon)Управляет стратегией удаления дубликатов полусоединения.
-
firstmatch(по умолчаниюon)Управляет стратегией FirstMatch полусоединения.
-
loosescan(по умолчаниюon)Управляет стратегией LooseScan полусоединения (не следует путать с Loose Index Scan для
GROUP BY). -
semijoin(по умолчаниюon)Управляет всеми стратегиями полусоединения.
Флаги
semijoin,firstmatch,loosescanиduplicateweedoutпозволяют управлять стратегиями полусоединения. Флагsemijoinуправляет использованием полусоединений. Если он установлен вon, флагиfirstmatchиloosescanобеспечивают более точный контроль над разрешенными стратегиями полусоединения.Если стратегия полусоединения
duplicateweedoutотключена, она не используется, если все другие применимые стратегии также отключены.Если
semijoinиmaterializationоба равныon, полусоединения также используют материализацию, где это применимо. Эти флаги установлены вonпо умолчанию.Для получения дополнительной информации см. Раздел 8.2.2.1, «Оптимизация подзапросов, производных таблиц и ссылок на представления с помощью преобразований полусоединения».
-
-
Флаги материализации подзапросов
-
materialization(по умолчаниюon)Управляет материализацией (включая материализацию полусоединений).
-
subquery_materialization_cost_based(по умолчаниюon)Использовать выбор материализации на основе затрат.
Флаг
materializationуправляет использованием материализации подзапросов. Если флагиsemijoinиmaterializationоба установленыon, полусоединения также используют материализацию там, где это применимо. По умолчанию эти флаги установленыon.Флаг
subquery_materialization_cost_basedпозволяет управлять выбором между материализацией подзапросов и преобразованием подзапросов изINвEXISTS. Если флаг установленon(по умолчанию), оптимизатор выбирает вариант на основе затрат между материализацией подзапроса и преобразованием подзапросов изINвEXISTS, если оба метода могут быть использованы. Если флаг установленoff, оптимизатор выбирает материализацию подзапроса вместо преобразования подзапросов изINвEXISTS.Более подробную информацию см. в разделе 8.2.2 «Оптимизация подзапросов, производных таблиц и ссылок на представления».
-
При назначении значения переменной optimizer_switch, флаги, которые не упоминаются, сохраняют свои текущие значения. Это позволяет включить или отключить определённое поведение оптимизатора в одном операторе без влияния на другое поведение. Оператор не зависит от других флагов оптимизатора и их значений. Предположим, что все оптимизации слияния индексов включены:
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=on,
index_merge_sort_union=on,
index_merge_intersection=on,
engine_condition_pushdown=on,
index_condition_pushdown=on,
mrr=on,mrr_cost_based=on,
block_nested_loop=on,batched_key_access=off,
materialization=on,semijoin=on,loosescan=on,
firstmatch=on,duplicateweedout=on,
subquery_materialization_cost_based=on,
use_index_extensions=on,
condition_fanout_filter=on,derived_merge=on,
prefer_ordering_index=on
Если сервер использует методы доступа «Слияние индексов UNION» или «Слияние индексов Sort-Union» для определенных запросов, и вы хотите проверить, работает ли оптимизатор лучше без них, установите значение переменной следующим образом:
mysql> SET optimizer_switch='index_merge_union=off,index_merge_sort_union=off';
mysql> SELECT @@optimizer_switch\G
*************************** 1. row ***************************
@@optimizer_switch: index_merge=on,index_merge_union=off,
index_merge_sort_union=off,
index_merge_intersection=on,
engine_condition_pushdown=on,
index_condition_pushdown=on,
mrr=on,mrr_cost_based=on,
block_nested_loop=on,batched_key_access=off,
materialization=on,semijoin=on,loosescan=on,
firstmatch=on,duplicateweedout=on,
subquery_materialization_cost_based=on,
use_index_extensions=on,
condition_fanout_filter=on,derived_merge=on,
prefer_ordering_index=on
© 2025 Oracle
Licensed under the GPLv2 License.