Spec-Zone .ru
спецификации, руководства, описания, API

8.8.5.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,                    subquery_materialization_cost_based=on,                    use_index_extensions=on

Изменить значение optimizer_switch, присвойте значение, состоящее из списка разделенных запятой значений одной или более команд:

SET [GLOBAL|SESSION] optimizer_switch='command[,command]...';

Каждый command у значения должна быть одна из форм, показанных в следующей таблице.

Синтаксис команды Значение
default Сбросьте каждую оптимизацию к ее значению по умолчанию
opt_name=default Установите именованную оптимизацию в ее значение по умолчанию
opt_name=off Отключите именованную оптимизацию
opt_name=on Включите именованной оптимизации

Порядок команд в значении не имеет значения, хотя 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