Spec-Zone.ru › MySQL 5.7

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

    pattern должно быть строковой литеральной, содержащей шаблон для поиска; для синтаксиса см. Раздел 12.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.

  • Столбцы могут быть сравнены только с константами; однако, это включает выражения, которые вычисляются до постоянных значений.

  • Столбцы, используемые в сравнениях, не могут быть типов BLOB или TEXT. Это исключение распространяется также на столбцы типов JSON, BIT и ENUM.

  • Строковое значение, которое будет сравниваться со столбцом, должно использовать ту же сортировку, что и столбец.

  • Соединения не поддерживаются напрямую; условия, включающие несколько таблиц, сдвигаются отдельно, где это возможно. Используйте расширенный вывод EXPLAIN, чтобы определить, какие условия фактически сдвигаются. См. Раздел 8.8.3, «Расширенный формат вывода EXPLAIN».

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/engine-condition-pushdown-optimization.html

Spec-Zone.ru

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