mysql5.7官网直译SQL语句优化--引擎压入条件优化

48 篇文章 0 订阅
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';


限制:引擎条件压入有如下限制:
1)只在NDB存储引擎上有支持
2)列只有与常量比较菜可以,其中包括表达式比较,但是值也只能是常量。
3)列对比不能用于任何BLOB或者是TEXT类型。
4)一个string值在列中被比较,必须使用相同的列值。

5)joins不能直接支持;条件中涉及到多表的压入可能分别压入。通过EXPLAIN的扩展输出去决定哪一个条件实际上压入了。具体请看8.8.3的扩展EXPLAIN Output Format。

到此关于引擎压入优化的查询就结束了,接下来要说的是1.5索引条件压入的优化。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值