您的位置:首页 > 数据库 > MySQL

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

2017-11-12 10:34 274 查看
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索引条件压入的优化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 优化 pushdown 集群