Spec-Zone .ru
спецификации, руководства, описания, API
|
Эта оптимизация улучшает эффективность прямых сравнений между неиндексированным столбцом и константой. В таких
случаях условие "отталкивается" к механизму
хранения для оценки. Эта оптимизация может использоваться только NDB
механизм хранения.
Для MySQL Cluster эта оптимизация может избавить от необходимости отправлять несоответствие строк по сети между узлами данных кластера и MySQL Server, который выпустил запрос, и может ускорить запросы, где это используется фактором 5 - 10 раз по случаям, где условие pushdown могло быть, всего лишь не используется.
Предположите, что таблица MySQL Cluster определяется следующим образом:
CREATE TABLE t1 ( a INT, b INT, KEY(a)) ENGINE=NDB;
Условие pushdown может использоваться с запросами такой как один показанный здесь, который включает сравнение между неиндексированным столбцом и константой:
SELECT a, b FROM t1 WHERE b = 10;
Использование условия pushdown может быть замечено в выводе EXPLAIN
:
mysql> EXPLAIN SELECT a,b FROM t1 WHERE b =
10\G
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 10 Extra: Using where with pushed condition
Однако, условие pushdown не может использоваться ни с одним из этих двух запросов:
SELECT a,b FROM t1 WHERE a = 10;SELECT a,b FROM t1 WHERE b + 1 = 10;
Условие pushdown не применимо к первому запросу, потому что индексирование существует на столбце a
. (Индексировать метод доступа был бы более эффективным и так будет выбран в
предпочтении к условию pushdown.) Условие pushdown не может использоваться для второго запроса потому что
сравнение, включающее неиндексированный столбец b
является косвенным. (Однако,
условие pushdown могло быть применено, если Вы должны были уменьшить b + 1 = 10
к
b = 9
в WHERE
пункт.)
Условие pushdown может также использоваться, когда индексированный столбец по сравнению с постоянным
использованием a >
или <
оператор:
mysql> EXPLAIN SELECT a, b FROM t1 WHERE a <
2\G
*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 type: rangepossible_keys: a key: a key_len: 5 ref: NULL rows: 2 Extra: Using where with pushed condition
Другие поддерживаемые сравнения для условия pushdown включают следующее:
column
[NOT] LIKE
pattern
pattern
должен быть строковый литерал, содержащий образец,
который будет соответствующим; для синтаксиса см. Раздел
12.5.1, "Функции Сравнения строк".
column
IS [NOT] NULL
column
IN (value_list
)
Каждый элемент в value_list
должно быть постоянное,
литеральное значение.
column
BETWEEN constant1
AND constant2
constant1
и constant2
должно каждый быть постоянное, литеральное значение.
Во всех случаях в предыдущем списке для условия возможно быть преобразованным в форму одного или более прямых сравнений между столбцом и константой.
Условие механизма pushdown включается по умолчанию. Чтобы отключить это при запуске сервера, установите optimizer_switch
системная переменная. Например, в a my.cnf
файл, используйте эти строки:
[mysqld]optimizer_switch=engine_condition_pushdown=off
Во времени выполнения включите условию pushdown как это:
SET optimizer_switch='engine_condition_pushdown=off';
Ограничения. Условие механизма pushdown подвергается следующим ограничениям:
Условие pushdown поддерживается только NDB
механизм хранения.
Столбцы могут быть по сравнению с константами только; однако, это включает выражения, которые оценивают к постоянным величинам.
Столбцы, используемые в сравнениях, не могут иметь ни одного из BLOB
или TEXT
типы.
Строковое значение, чтобы быть по сравнению со столбцом должно использовать то же самое сопоставление в качестве столбца.
Соединения непосредственно не поддерживаются; условия, включающие многократные
таблицы, продвигаются отдельно где только возможно. Использовать EXPLAIN EXTENDED
определить, какие условия фактически отталкиваются.