欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MySQL查询优化之四-引擎条件下推优化优化(Engine Condition Pushdown Optimization)

程序员文章站 2024-03-17 18:37:16
...

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


觉得文章对你有帮助,可以用微信扫描二维码捐赠给博主,谢谢!
MySQL查询优化之四-引擎条件下推优化优化(Engine Condition Pushdown Optimization)
如需转载请标明出处:http://blog.csdn.net/itas109
QQ技术交流群:129518033