这种优化提高了非索引列和常量之间直接比较的效率。在这种情况下,条件被“下推”到存储引擎进行评估。此优化只能由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
>
当使用or运算符
将索引列与常量进行比较时,也可以使用引擎条件下推
<
:
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] LIKEpattern
pattern
必须是包含要匹配的模式的字符串文字;有关语法,请参阅第 12.8.1 节,“字符串比较函数和运算符”。column
IS [NOT] NULLcolumn
IN (value_list
)中的每一项都
value_list
必须是常量、文字值。column
BETWEENconstant1
ANDconstant2
constant1
并且constant2
每个都必须是常量,文字值。
在前面列表中的所有情况下,都可以将条件转换为列和常量之间的一次或多次直接比较的形式。
默认情况下启用引擎状态下推。要在服务器启动时禁用它,请将
optimizer_switch
系统变量的
engine_condition_pushdown
标志设置为off
。例如,在一个
my.cnf
文件中,使用这些行:
[mysqld]
optimizer_switch=engine_condition_pushdown=off
在运行时,像这样禁用条件下推:
SET optimizer_switch='engine_condition_pushdown=off';
限制。 发动机状态下推受以下限制: