下推到 TiKV 的表达式列表

    禁止特定表达式下推

    已支持下推的表达式列表中的函数和运算符,或特定的数据类型(仅限BIT 类型)的计算过程因下推而出现异常时,你可以使用黑名单功能禁止其下推,从而快速恢复 TiDB 业务。具体而言,你可以将函数名、运算符名,或数据列类型加入黑名单 mysql.expr_pushdown_blacklist 中,以禁止特定表达式下推。具体方法,请参阅。

    mysql.expr_pushdown_blacklist 的 schema 如下:

    以上结果字段解释如下:

    • name:禁止下推的函数名、运算符名或数据类型。
    • store_type:用于指定希望禁止该函数、运算符或数据类型下推到哪些组件进行计算。组件可选 tidbtikvtiflashstore_type 不区分大小写,如果需要禁止向多个存储引擎下推,各个存储之间需用逗号隔开。
      • store_typetidb 时表示在读取 TiDB 内存表时,是否允许该函数在其他 TiDB Server 上执行。
      • store_typetikv 时表示是否允许该函数在 TiKV Server 的 Coprocessor 模块中执行。
      • store_typetiflash 时表示是否允许该函数在 TiFlash Server 的 Coprocessor 模块中执行。
    • reason:用于记录该函数被加入黑名单的原因。

    执行以下步骤,可将一个或多或数据类型(仅限 ENUM 类型 和 )加入黑名单:

    1. mysql.expr_pushdown_blacklist 插入以下内容:

      • 希望禁止下推的函数名、运算符名或数据类型
      • 希望禁止下推的存储引擎

    执行以下步骤,可将一个或多个函数名、运算符名或数据类型移出黑名单:

    1. mysql.expr_pushdown_blacklist 表中删除对应的函数名、运算符名或数据类型。
    2. 执行 admin reload expr_pushdown_blacklist;

    以下示例首先将函数 DATE_FORMAT()、运算符 > 及 数据类型 BIT 加入黑名单,然后再将运算符 > 从黑名单中移出。

    黑名单是否生效可以从 explain 结果中进行观察(参见如何理解 explain 结果)。

    1. tidb> create table t(a int);
    2. Query OK, 0 rows affected (0.06 sec)
    3. tidb> explain select * from t where a < 2 and a > 2;
    4. | id | estRows | task | access object | operator info |
    5. +-------------------------+----------+-----------+---------------+------------------------------------+
    6. | TableReader_7 | 0.00 | root | | data:Selection_6 |
    7. | └─Selection_6 | 0.00 | cop[tikv] | | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) |
    8. | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
    9. +-------------------------+----------+-----------+---------------+------------------------------------+
    10. 3 rows in set (0.00 sec)
    11. tidb> insert into mysql.expr_pushdown_blacklist values('date_format()', 'tikv',''), ('>','tikv',''), ('bit','tikv','');
    12. Query OK, 2 rows affected (0.01 sec)
    13. Records: 2 Duplicates: 0 Warnings: 0
    14. Query OK, 0 rows affected (0.00 sec)
    15. tidb> explain select * from t where a < 2 and a > 2;
    16. +-------------------------+----------+-----------+---------------+------------------------------------+
    17. | id | estRows | task | access object | operator info |
    18. +-------------------------+----------+-----------+---------------+------------------------------------+
    19. | Selection_7 | 10000.00 | root | | gt(ssb_1.t.a, 2), lt(ssb_1.t.a, 2) |
    20. | └─TableReader_6 | 10000.00 | root | | data:TableFullScan_5 |
    21. +-------------------------+----------+-----------+---------------+------------------------------------+
    22. 3 rows in set (0.00 sec)
    23. tidb> delete from mysql.expr_pushdown_blacklist where name = '>';
    24. Query OK, 1 row affected (0.01 sec)
    25. tidb> admin reload expr_pushdown_blacklist;
    26. Query OK, 0 rows affected (0.00 sec)
    27. tidb> explain select * from t where a < 2 and a > 2;
    28. +---------------------------+----------+-----------+---------------+--------------------------------+
    29. | id | estRows | task | access object | operator info |
    30. +---------------------------+----------+-----------+---------------+--------------------------------+
    31. | Selection_8 | 0.00 | root | | lt(ssb_1.t.a, 2) |
    32. | └─TableReader_7 | 0.00 | root | | data:Selection_6 |
    33. | └─Selection_6 | 0.00 | cop[tikv] | | gt(ssb_1.t.a, 2) |
    34. | └─TableFullScan_5 | 10000.00 | cop[tikv] | table:t | keep order:false, stats:pseudo |
    35. +---------------------------+----------+-----------+---------------+--------------------------------+
    36. 4 rows in set (0.00 sec)
    • admin reload expr_pushdown_blacklist 只对执行该 SQL 语句的 TiDB server 生效。若需要集群中所有 TiDB server 生效,需要在每台 TiDB server 上执行该 SQL 语句。
    • 表达式黑名单功能在 v3.0.0 及以上版本中支持。
    运算符原始名称 运算符别名
    < lt
    > gt
    <= le
    >= ge
    = eq
    != ne
    ne
    <=> nulleq
    | bitor
    && bitand
    || or
    ! not
    in in
    + plus
    - minus
    * mul
    / div
    DIV intdiv
    IS NULL isnull
    IS TRUE istrue
    IS FALSE isfalse