Engine Condition Pushdown Optimization(引擎压入条件优化)
这个优化用来提高直接对比一个无索引列和常量值比较的效率。在这种情况下,条件压入存储引擎去评估。这种优化只能用在NDB存储引擎上。
对于NDB集群,这个优化能够排除那些不匹配的行数从集群中的数据节点到mysql服务器之间通过网络传输的数据,并且如果使用了优化比不使用能够提高查询5到10倍的效率。
假设一个NDB集群中的表定义如下:
CREATE TABLE t1 (
a INT,
b INT,
KEY(a) //在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=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
//虽然a列中有索引,但是因为使用了<2的条件,所以最终的Extra列中输出了pushed condition优化值。
其他的支持压入优化比较的条件如下:
1)column [not] like pattern
pattern必须是一个包含字符串原义的模式被匹配;具体语法,请看12.5.1的字符串比较方法。
2)column is [not] null
3)column in (value_list)
每一个在value_list的值必须是一个常量或者是字符串原义值。
4)column between constant1 and constant2
constant1 和constant2值必须都是厂里值或者是字符串原义值。
在上述列出的所有情况下,条件转变为一个或者多个直接对比一个列和常量值是可能的。引擎条件压入优化默认是可用的。当然也可以在服务启动之前设置使其失效。通过optimizer_switch系统变量。例如在my.cnf文件使用如下行的配置信息:
[mysqld]
optimizer_switch=engine_condition_pushdown=off
在运行时,也可以通过如下设置来使其失效:
SET optimizer_switch='engine_condition_pushdown=off';