8.2.1.4 引擎状态下推式优化

这种优化提高了非索引列和常量之间直接比较的效率。在这种情况下,条件将“推入”存储引擎进行评估。此优化只能由NDB存储引擎使用。

对于 NDB 群集,此优化可以消除在群集的数据节点与发出查询的 MySQL 服务器之间通过网络发送不匹配的行的需要,并且可以将查询的使用速度提高 5 到 10 倍(在某些情况下)可以但不使用条件下推的地方。

假设 NDB 群集 table 定义如下:

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是间接的,因此条件下推不能用于第二个查询。 (但是,如果要在WHERE子句中将b + 1 = 10减小为b = 9,则可以应用条件下推.)

当使用><运算符将索引列与常量进行比较时,也可以使用条件下推:

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
  • column IS [NOT] NULL

  • column IN (value_list)

  • value_list *中的每个项目都必须是恒定的 Literals 值。
  • column BETWEEN constant1 AND constant2
  • constant1 constant2 *必须分别是一个常量 Literals 值。

在上述列 table 中的所有情况下,都有可能将条件转换为列与常量之间的一个或多个直接比较的形式。

默认情况下,引擎状态下推处于启用状态。要在服务器启动时禁用它,请设置optimizer_switch系统变量。例如,在my.cnf文件中,使用以下几行:

[mysqld]
optimizer_switch=engine_condition_pushdown=off

在运行时,禁用条件下推,如下所示:

SET optimizer_switch='engine_condition_pushdown=off';

限制. 发动机状态下推受以下限制:

  • 条件下推仅受NDB存储引擎支持。

  • 列只能与常量进行比较;但是,这包括计算结果为常数的 table 达式。

  • 比较中使用的列不能是任何BLOBTEXT类型。此排除范围也扩展到JSONBITENUM列。

  • 要与列进行比较的字符串值必须使用与列相同的排序规则。

  • 不直接支持联接。涉及多个 table 的条件将在可能的情况下分别推送。使用扩展的EXPLAIN输出来确定实际推低哪些条件。参见第 8.8.3 节“扩展的 EXPLAIN 输出格式”