Spec-Zone.ru › MySQL 9.2

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] LIKE pattern

    pattern должно быть строковым литералом, содержащим шаблон для сопоставления; для синтаксиса см. Раздел 14.8.1, «Функции и операторы сравнения строк».

  • column IS [NOT] NULL

  • column IN (value_list)

    Каждый элемент в value_list должен быть константой, литеральным значением.

  • column BETWEEN constant1 AND constant2

    constant1 и 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 (см. ).

Алгоритмы соединения не могут быть объединены с ссылками на столбцы из предыдущих таблиц в следующих двух ситуациях:

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

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

Столбцы из предковых таблиц в соединении могут быть спущены вниз, при условии, что они удовлетворяют перечисленным ранее требованиям. Пример такого запроса, использующего таблицу 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/engine-condition-pushdown-optimization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API