8.2.1.5 Engine Condition Pushdown Optimization
这种优化改善了直接比较在一个非索引列和一个常量的效率,在这种情况下,条件被推入到存储引擎进行评估,
这种优化只能用于NDB 存储引擎:
对于MySQL Cluster, 优化器能消除发送不匹配记录的需要通过cluster质检的数据节点,
可以加快查询速度
假设一个MySQL Cluster 表定义如下:
CREATE TABLE t1 (
a INT,
b INT,
KEY(a)
) ENGINE=NDB;
条件内推可以用于查询 如下, 其中包括一个比较在一个非索引列和常数之间:
SELECT a, b FROM t1 WHERE b = 10;
条件内推的使用可以看下面执行计划的输出:
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列上,(一个索引访问方法比条件内推更有效)
条件内推不能用于第2个查询 因为由于间接的涉及非索引列b(然而,条件内推可以应用如果你reduce 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 必须是一个字符串,其文本中包含的模式被匹配:
column IS [NOT] NULL
column IN (value_list)
在value_list中的每个值 必须是一个常量,常量值
在所有的情况下,先前处理的列表, 它是可能的对于条件被转换成一个或者多个直接比较的形式在一个列和一个常量之间:
引擎条件内推默认是启用的,在启动的时候关闭它,设置参数optimizer_switch 在my.cnf 使用下面行:
[mysqld]
optimizer_switch=engine_condition_pushdown=off
At runtime, enable condition pushdown like this:
SET optimizer_switch=’engine_condition_pushdown=off’;
限制,存储条件内推受以下限制: