MySQL查询优化之四-引擎条件下推优化优化(Engine Condition Pushdown Optimization)
MySQL查询优化之四-引擎条件下推优化优化(Engine Condition Pushdown Optimization)
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033
环境:
MySQL版本:5.5.15
操作系统:windows
本文讨论引擎条件下推优化优化(Engine Condition Pushdown Optimization)。
这种优化提高了非索引列和常量之间的直接比较的效率。 在这种情况下,条件被“下推”到存储引擎进行评估。 这种优化只能由NDB存储引擎使用。
对于NDB集群,这种优化可以消除在集群的数据节点和发出查询的MySQL服务器之间通过网络发送不匹配的行的需要,并且可以加速比使用5到10倍的查询更快的查询 那里的条件下推可能是,但没有使用。
假设一个NDB表定义如下:
CREATE TABLE t1 (
a INT,
b INT,
KEY(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的比较是间接的。 (但是,如果要在WHERE子句中将b + 1 = 10减少到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
其他支持的条件下推比较包括以下内容:
- 列 [NOT] LIKE pattern
pattern必须是包含要匹配的模式的字符串文字 - 列 IS [NOT] NULL
- 列 IN (value_list)
value_list中的每个项目都必须是常量,文字值。 - 列 BETWEEN constant1 AND constant2
constant1和constant2每个都必须是常量,文字值。
在前面列表中的所有情况中,条件可以被转换成列和常数之间的一个或多个直接比较的形式。
引擎条件下推是默认启用的。 要在服务器启动时禁用它,请设置optimizer_switch系统变量。 例如,在my.cnf文件中,使用这些行:
[mysqld]
optimizer_switch=engine_condition_pushdown=off
在运行时,像这样禁用条件下推:
SET optimizer_switch='engine_condition_pushdown=off';
条件下推有以下限制:
- 条件下推支持NDB存储引擎。
- 列可以与常量进行比较; 但是,这包括评估为常数值的表达式。
- 用于比较的列不能是任何BLOB或TEXT类型。
- 要与列进行比较的字符串值必须使用与列相同的排序规则。
- Joins 不直接支持; 涉及多个表格的条件在可能的情况下分开推送。使用扩展的EXPLAIN输出来确定哪些条件实际上被推下来。
Reference:
https://dev.mysql.com/doc/refman/5.5/en/condition-pushdown-optimization.html
觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033