8.2.1.5 Engine Condition Pushdown Optimization 引擎条件下推优化
这种优化改善了直接比较在一个非索引列和一个常量比较的效率。
在这种情况下, 条件是 下推到存储引擎用于评估,这个优化智能用于NDB存储引擎
MySQL 集群,这个优化可以消除需要发送非匹配的记录通过网络在cluster的数据节点和MySQL Server
假设 MySQL 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;
条件下推不适用于第一个查询因为一个index 存在在列a,
(一个Index 访问方法会更加有效率因此会优先选择)
条件下推不能用于第2个查询是因为 比较涉及非索引列是对的(然而,条件下推可以应用如果你降低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
其他支持的比较用于条件下推如下:
1.column [NOT] LIKE pattern
模式必须是一个字符串包含匹配的模式
column IS [NOT] NULL
column IN (value_list) 每个item 在value_list 是一个常量,常量值
column BETWEEN constant1 AND constant2
在前面列表的所有例子中,它是可以的对于条件被转换成一个或者俄夺各直接比较的格式在一个列和一个常量