Spec-Zone .ru
спецификации, руководства, описания, API
|
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, subquery_materialization_cost_based=on, use_index_extensions=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 |
Использование средств управления BKA присоединяется к алгоритму |
Блокируйте Вложенный цикл | block_nested_loop |
Использование средств управления BNL присоединяется к алгоритму |
Условие механизма Pushdown | engine_condition_pushdown |
Условие механизма средств управления pushdown |
Индексируйте Условие Pushdown | index_condition_pushdown |
Средства управления индексируют условие pushdown |
Индексируйте Расширения | use_index_extensions |
Использование средств управления индексирует расширения |
Индексируйте Слияние | index_merge |
Средства управления все Индексируют оптимизацию Слияния |
index_merge_intersection |
Средства управления Индексировать Перекрестная оптимизация Доступа Слияния | |
index_merge_sort_union |
Средства управления Индексировать оптимизация Доступа Объединения сортировки слиянием | |
index_merge_union |
Средства управления Индексировать оптимизация Доступа Объединения Слияния | |
Многодиапазонное Чтение | mrr |
Управляет Многодиапазонной стратегией Чтения |
mrr_cost_based |
Использование средств управления MRR на основе издержек, если mrr=on
|
|
Полуобъединение | semijoin |
Средства управления все стратегии полуобъединения |
firstmatch |
Управляет полуобъединением стратегия FirstMatch | |
loosescan |
Управляет полуобъединением стратегия LooseScan (чтобы не быть перепутанным withLooseScan для GROUP BY )
|
|
Материализация подзапроса | materialization |
Материализация средств управления (включая материализацию полуобъединения) |
subquery_materialization_cost_based |
Используемый выбор материализации на основе издержек |
block_nested_loop
и batched_key_access
флаги были
добавлены в MySQL 5.6.3. Для batched_key_access
иметь любой эффект когда
установлено в on
, mrr
флаг должен также быть on
. В настоящий момент оценка стоимости для MRR слишком пессимистична.
Следовательно, это также необходимо для mrr_cost_based
быть off
для BKA, которая будет использоваться.
semijoin
, firstmatch
, loosescan
, и materialization
флаги были добавлены в
MySQL 5.6.5, чтобы включить управлению полуобъединением и стратегиями материализации подзапроса. semijoin
отметьте средства управления, используются ли полуобъединения. Если это
устанавливается в on
, firstmatch
и loosescan
флаги включают более прекрасному управлению разрешенными стратегиями
полуобъединения. materialization
отметьте средства управления, используется ли
материализация подзапроса. Если semijoin
и materialization
оба on
, полуобъединения также
используют материализацию где применимый. Эти флаги on
по умолчанию.
subquery_materialization_cost_based
был добавлен в MySQL 5.6.7, чтобы включить
управлению выбором между материализацией подзапроса и IN -> EXISTS
преобразование подзапроса. Если флаг on
(значение по умолчанию), оптимизатор
выполняет выбор на основе издержек между материализацией подзапроса и IN ->
EXISTS
преобразование подзапроса, если любой метод мог бы использоваться. Если флаг off
, оптимизатор выбирает материализацию подзапроса IN ->
EXISTS
преобразование подзапроса, которое было предыдущим поведением перед MySQL 5.6.7.
Для получения дополнительной информации об отдельных стратегиях оптимизации, см. следующие разделы:
Когда Вы присваиваете значение 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, subquery_materialization_cost_based=on, use_index_extensions=on
Если сервер использует Индексировать Объединение Слияния, или Индексируйте методы доступа Объединения сортировки слиянием для определенных запросов, и Вы хотите проверить, выполнит ли оптимизатор лучше без них, установите значение переменной как это:
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, subquery_materialization_cost_based=on, use_index_extensions=on