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索引条件压入的优化。
这个优化用来提高直接对比一个无索引列和常量值比较的效率。在这种情况下,条件压入存储引擎去评估。这种优化只能用在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索引条件压入的优化。
相关文章推荐
- mysql5.7官网直译SQL语句优化--索引条件压入优化
- mysql5.7官网直译SQL语句优化--where条件查询优化
- mysql5.7官网直译SQL语句优化--嵌套循环连接算法
- mysql5.7官网直译SQL语句优化--函数调用的优化
- mysql5.7官网直译SQL语句优化--分组优化
- mysql5.7官网直译SQL语句优化--通过物化来优化子查询
- mysql5.7官网直译SQL语句优化--派生表和试图引用的优化
- mysql5.7官网直译SQL语句优化--IS NULL查询优化
- mysql5.7官网直译SQL语句优化--排序优化
- mysql5.7官网直译SQL语句优化--索引合并的优化
- mysql5.7官网直译SQL语句优化--范围查询优化
- mysql5.7官网直译SQL语句优化--左右连接的优化
- mysql5.7官网直译SQL语句优化--使用存在策略来优化子查询
- mysql5.7官网直译SQL语句优化--嵌套连接的优化
- mysql5.7官网直译SQL语句优化--子查询,派生表和试图引用
- mysql5.7官网直译SQL语句优化--外部链接简单化
- mysql5.7官网直译SQL语句优化--DISTINCT,LIMIT优化
- mysql5.7官网直译SQL语句优化--select语句优化
- mysql5.7官网直译SQL语句优化--块式嵌套循环和批量key访问连接
- mysql5.7官网直译SQL语句优化--多范围读取优化