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

8.13.3. Механизм Кондайшн Пушдаун Оптимизэйшн

Эта оптимизация улучшает эффективность прямых сравнений между неиндексированным столбцом и константой. В таких случаях условие "отталкивается" к механизму хранения для оценки. Эта оптимизация может использоваться только NDB механизм хранения.

Отметить

NDB механизм хранения в настоящий момент не доступен в MySQL 5.7. Если Вы интересуетесь использованием MySQL Cluster, см. MySQL Cluster NDB 7.2, который предоставляет информацию о MySQL Cluster NDB 7.2, который основан на MySQL 5.5, но содержит последние улучшения и исправления для NDBCLUSTER.

Для 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 включают следующее:

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

Условие механизма pushdown включается по умолчанию. Чтобы отключить это при запуске сервера, установите optimizer_switch системная переменная. Например, в a my.cnf файл, используйте эти строки:

[mysqld]optimizer_switch=engine_condition_pushdown=off

Во времени выполнения включите условию pushdown как это:

SET optimizer_switch='engine_condition_pushdown=off';

Ограничения. Условие механизма pushdown подвергается следующим ограничениям: