8.2.1.5 Engine Condition Pushdown Optimization

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’;

限制,存储条件内推受以下限制:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scan724

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值