10.2.1.5 Оптимизация спуска условий хранилища
Данная оптимизация повышает эффективность прямых сравнений между столбцом без индекса и константой. В таких случаях условие «спускается» в хранилище для обработки. Данная оптимизация может использоваться только движком хранилища 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;
Спуск условий хранилища здесь неприменим, потому что индекс существует на столбце a. (Метод доступа к индексу был бы более эффективным и поэтому был бы выбран в приоритете перед спуском условий.)
Спуск условий хранилища также может быть использован, когда столбец с индексом сравнивается с константой, используя оператор > или <:
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должно быть строковым литералом, содержащим шаблон для сопоставления; для синтаксиса см. Раздел 14.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.В NDB 9.2 столбцы могут быть сравнены друг с другом, при условии, что они имеют точно такой же тип, включая одинаковую знакомость, длину, кодировку символов, точность и масштаб, где это применимо.
Столбцы, используемые в сравнениях, не могут быть какого-либо из типов
BLOBилиTEXT. Это исключение распространяется и на столбцы типовJSON,BITиENUM.Строковое значение для сравнения со столбцом должно использовать ту же сортировку, что и столбец.
Соединения напрямую не поддерживаются; условия, включающие несколько таблиц, спускаются отдельно, где это возможно. Используйте расширенный вывод
EXPLAIN, чтобы определить, какие условия фактически спускаются вниз. См. Раздел 10.8.3, «Формат расширенного вывода EXPLAIN».
Ранее спуск условий хранилища был ограничен терминами, относящимися к значениям столбцов из той же таблицы, к которой условие спускалось. В NDB 9.2 к значениям столбцов из таблиц, которые находятся ранее в плане запроса, также можно обращаться из спускаемых условий. Это уменьшает количество строк, с которыми должен работать узел SQL во время обработки соединений. Фильтрация также может выполняться параллельно в потоках LDM, а не в одном процессе mysqld. Это может существенно улучшить производительность запросов.
NDB может спустить внешнее соединение с помощью сканирования, если нет неспускаемых условий ни в одной таблице, используемой в том же соединении, или в любой таблице в соединениях выше него, от которых он зависит. Это также верно для полусоединения, при условии, что используемая оптимизационная стратегия является firstMatch (см. ).
Алгоритмы соединения не могут быть объединены с ссылками на столбцы из предыдущих таблиц в следующих двух ситуациях:
Когда любая из ссылаемых предыдущих таблиц находится в буфере соединения. В этом случае каждая строка, извлечённая из сканируемой отфильтрованной таблицы, сравнивается с каждой строкой в буфере. Это означает, что нет одной конкретной строки, из которой можно извлечь значения столбцов при генерации фильтра сканирования.
Когда столбец происходит из дочерней операции в спускаемом соединении. Это происходит потому, что строки, на которые ссылаются из предковых операций в соединении, ещё не извлечены, когда генерируется фильтр сканирования.
Столбцы из предковых таблиц в соединении могут быть спущены вниз, при условии, что они удовлетворяют перечисленным ранее требованиям. Пример такого запроса, использующего таблицу t1, созданную ранее, показан здесь:
mysql> EXPLAIN
-> SELECT * FROM t1 AS x
-> LEFT JOIN t1 AS y
-> ON x.a=0 AND y.b>=3\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: x
partitions: p0,p1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
filtered: 100.00
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: y
partitions: p0,p1
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4
filtered: 100.00
Extra: Using where; Using pushed condition (`test`.`y`.`b` >= 3); Using join buffer (hash join)
2 rows in set, 2 warnings (0.00 sec)
© 2025 Oracle
Licensed under the GPLv2 License.