8.2.1.4 Оптимизация сдвиги условий в движок
Данная оптимизация повышает эффективность прямых сравнений между столбцом без индекса и константой. В таких случаях условие “сдвигается вниз” в движок хранения для оценки. Эту оптимизацию может использовать только движок хранения NDB.
Для NDB Cluster эта оптимизация может устранить необходимость отправки несоответствующих строк по сети между узлами данных кластера и сервером MySQL, который выдал запрос, и может ускорить запросы, где она используется, в 5-10 раз по сравнению с случаями, когда сдвиг условия мог быть, но не был использован.
Предположим, что таблица NDB Cluster определена следующим образом:
CREATE TABLE t1 (
a INT,
b INT,
KEY(a)
) ENGINE=NDB;
Сдвиг условия в движок можно использовать с запросами, такими как показанный здесь, который включает сравнение между столбцом без индекса и константой:
SELECT a, b FROM t1 WHERE b = 10;
Использование сдвига условия в движок можно увидеть в выводе EXPLAIN:
mysql> EXPLAIN SELECT a,b FROM t1 WHERE b = 10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 10
Extra: Using where with pushed condition
Однако, сдвиг условия в движок не может быть использован ни с одним из этих двух запросов:
SELECT a,b FROM t1 WHERE a = 10;
SELECT a,b FROM t1 WHERE b + 1 = 10;
Сдвиг условия в движок не применим к первому запросу, потому что индекс существует для столбца a. (Метод доступа по индексу был бы более эффективным, и поэтому он был бы выбран в приоритете по сравнению со сдвигом условия.) Сдвиг условия в движок не может быть использован для второго запроса, потому что сравнение, включающее столбец без индекса b, является косвенным. (Однако, сдвиг условия в движок мог бы быть применён, если бы вы сократили b + 1
= 10 до b = 9 в фрагменте WHERE.)
Сдвиг условия в движок также может быть использован, когда столбец с индексом сравнивается с константой с использованием оператора > или <:
mysql> EXPLAIN SELECT a, b FROM t1 WHERE a < 2\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: t1
type: range
possible_keys: a
key: a
key_len: 5
ref: NULL
rows: 2
Extra: Using where with pushed condition
Другие поддерживаемые сравнения для сдвига условия в движок включают следующие:
-
column[NOT] LIKEpatternpatternдолжно быть строковой литеральной, содержащей шаблон для поиска; для синтаксиса см. Раздел 12.8.1, «Функции сравнения строк и операторы». columnIS [NOT] NULL-
columnIN (value_list)Каждый элемент в
value_listдолжен быть константой, литеральным значением. -
columnBETWEENconstant1ANDconstant2constant1иconstant2должны быть константами, литеральными значениями.
Во всех случаях в предыдущем списке условие можно преобразовать в форму одного или нескольких прямых сравнений между столбцом и константой.
Сдвиг условия в движок по умолчанию включен. Чтобы отключить его при запуске сервера, установите флаг optimizer_switch системной переменной engine_condition_pushdown в значение off. Например, в файле my.cnf используйте эти строки:
[mysqld]
optimizer_switch=engine_condition_pushdown=off
Во время выполнения отключите сдвиг условия следующим образом:
SET optimizer_switch='engine_condition_pushdown=off';
Ограничения. Сдвиг условия в движок имеет следующие ограничения:
Сдвиг условия в движок поддерживается только движком хранения
NDB.Столбцы могут быть сравнены только с константами; однако, это включает выражения, которые вычисляются до постоянных значений.
Столбцы, используемые в сравнениях, не могут быть типов
BLOBилиTEXT. Это исключение распространяется также на столбцы типовJSON,BITиENUM.Строковое значение, которое будет сравниваться со столбцом, должно использовать ту же сортировку, что и столбец.
Соединения не поддерживаются напрямую; условия, включающие несколько таблиц, сдвигаются отдельно, где это возможно. Используйте расширенный вывод
EXPLAIN, чтобы определить, какие условия фактически сдвигаются. См. Раздел 8.8.3, «Расширенный формат вывода EXPLAIN».
© 2025 Oracle
Licensed under the GPLv2 License.