文档

谓词完全下推

更新时间:

当需要查询大量数据的时候,引擎层访问数据、SQL层的交互和计算都会占用大量的开销。PolarDB MySQL版会将谓词下推到引擎层进行计算,极大的减少性能开销,提升查询性能。

前提条件

集群版本需为PolarDB MySQL版8.0版本且修订版本需满足如下条件:

  • 8.0.1.1.5或以上。

  • 8.0.2.2.0 或以上。

如何查看集群版本,请参见查询版本号

背景信息

在社区MySQL中,索引的范围条件可以用来确定引擎的扫描范围,使索引仅扫描对应范围的数据。这些条件在确定引擎的扫描范围后,依然保留了下来。即对所有引擎输出的数据再次做对应的SQL计算过滤,而引擎输出的数据一定会满足对应的条件。这会增加条件的计算量,同时阻碍一些计算下推到引擎层。PolarDB MySQL版对这些谓词做了完全的下推,即范围条件体现在引擎扫描范围后即可从SQL层消除,从而减少计算量,增加计算下推场景。

使用限制

查询SQL中的Offset取值要大于512。

说明

您可以配置ignore_polar_optimizer_ruleON,忽略该限制。具体操作请参见设置集群参数和节点参数

参数名称

级别

描述

ignore_polar_optimizer_rule

Global、Session

忽略Polar优化限制规则的控制开关。

  • ON:开启忽略Polar优化限制规则开关。

  • OFF(默认值):关闭忽略Polar优化限制规则开关。

使用方法

通过系统参数loose_optimizer_switch中的detach_range_condition开启谓词完全下推优化功能。具体操作请参见设置集群参数和节点参数

参数名称

级别

描述

loose_optimizer_switch

Global、Session

查询优化的总控制开关。其中,计算下推的子控制开关如下:

  • limit_offset_pushdown:Limit Offset下推优化开关

    • ON(默认值):开启Limit Offset下推优化开关。

    • OFF:关闭Limit Offset下推优化开关。

  • detach_range_condition:谓词完全下推优化开关

    • ON(默认值):开启谓词完全下推优化开关。

    • OFF:关闭谓词完全下推优化开关。

示例

本文基于TPCH的Schema进行举例。关闭谓词完全下推功能后,Q2的执行计划如下。可以看到关闭谓词完全下推功能后,Extra列展示为Using where,即体现在引擎范围中的条件依然保留着。

set @@optimizer_switch='detach_range_condition=off';
EXPLAIN SELECT * FROM lineitem WHERE l_orderkey > 10 AND l_orderkey < 60000000 LIMIT 10000000, 10\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: lineitem
   partitions: NULL
         type: range
possible_keys: PRIMARY,i_l_orderkey,i_l_orderkey_quantity
          key: PRIMARY
      key_len: 4
          ref: NULL
         rows: 29720232
     filtered: 100.00
        Extra: Using where

设置变量ignore_polar_optimizer_ruleON,除Limit Offset场景外,其他范围查询体现在引擎范围中的谓词也可以被消除。以TPCH的Q5和Q6为例,设置ignore_polar_optimizer_ruleON后,可以消除谓词。Extra列仅显示为Using index,不再显示Using where

  • Q5:

    set @@ignore_polar_optimizer_rule=on;
    EXPLAIN SELECT COUNT(*) FROM lineitem WHERE l_suppkey > 10 AND l_suppkey < 50000\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: lineitem
       partitions: NULL
             type: range
    possible_keys: i_l_suppkey_partkey,i_l_suppkey
              key: i_l_suppkey
          key_len: 5
              ref: NULL
             rows: 29720232
         filtered: 100.00
            Extra: Using index
  • Q6:

    set @@ignore_polar_optimizer_rule=on;
    EXPLAIN SELECT COUNT(*) FROM LINEITEM WHERE l_receiptDATE > '1992-01-03' AND l_receiptDATE < '1994-12-31'\G
    *************************** 1. row ***************************
               id: 1
      select_type: SIMPLE
            table: LINEITEM
       partitions: NULL
             type: range
    possible_keys: i_l_receiptdate
              key: i_l_receiptdate
          key_len: 4
              ref: NULL
             rows: 29720232
         filtered: 100.00
            Extra: Using index

性能效果

基于TPCH 10 scale的数据,针对上文所述的查询示例Q5、Q6。开启与关闭谓词完全下推功能的性能对比如下:谓词下推