当前位置:   article > 正文

mysql5.7官网直译SQL语句优化--引擎压入条件优化_mysql5.7不支持optimize

mysql5.7不支持optimize
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索引条件压入的优化。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/800625
推荐阅读
  

闽ICP备14008679号