Skip to content

Commit

Permalink
revise expressions pushed down (#8684)
Browse files Browse the repository at this point in the history
  • Loading branch information
Yisaer authored Mar 24, 2022
1 parent 5d946e1 commit 503f755
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 9 deletions.
22 changes: 13 additions & 9 deletions functions-and-operators/expressions-pushed-down.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ aliases: ['/docs-cn/dev/functions-and-operators/expressions-pushed-down/','/docs
| [比较运算](/functions-and-operators/operators.md#比较方法和操作符) | <, <=, =, != (`<>`), >, >=, [`<=>`](https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to), [`IN()`](https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in), IS NULL, LIKE, IS TRUE, IS FALSE, [`COALESCE()`](https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_coalesce) |
| [数值运算](/functions-and-operators/numeric-functions-and-operators.md) | +, -, *, /, [`ABS()`](https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_abs), [`CEIL()`](https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_ceil), [`CEILING()`](https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_ceiling), [`FLOOR()`](https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_floor) |
| [控制流运算](/functions-and-operators/control-flow-functions.md) | [`CASE`](https://dev.mysql.com/doc/refman/5.7/en/flow-control-functions.html#operator_case), [`IF()`](https://dev.mysql.com/doc/refman/5.7/en/flow-control-functions.html#function_if), [`IFNULL()`](https://dev.mysql.com/doc/refman/5.7/en/flow-control-functions.html#function_ifnull) |
| [JSON运算](/functions-and-operators/json-functions.md) | [JSON_TYPE(json_val)][json_type],<br/> [JSON_EXTRACT(json_doc, path[, path] ...)][json_extract],<br/> [JSON_OBJECT(key, val[, key, val] ...)][json_object],<br/> [JSON_ARRAY([val[, val] ...])][json_array],<br/> [JSON_MERGE(json_doc, json_doc[, json_doc] ...)][json_merge],<br/> [JSON_SET(json_doc, path, val[, path, val] ...)][json_set],<br/> [JSON_INSERT(json_doc, path, val[, path, val] ...)][json_insert],<br/> [JSON_REPLACE(json_doc, path, val[, path, val] ...)][json_replace],<br/> [JSON_REMOVE(json_doc, path[, path] ...)][json_remove] |
| [JSON 运算](/functions-and-operators/json-functions.md) | [JSON_TYPE(json_val)][json_type],<br/> [JSON_EXTRACT(json_doc, path[, path] ...)][json_extract],<br/> [JSON_OBJECT(key, val[, key, val] ...)][json_object],<br/> [JSON_ARRAY([val[, val] ...])][json_array],<br/> [JSON_MERGE(json_doc, json_doc[, json_doc] ...)][json_merge],<br/> [JSON_SET(json_doc, path, val[, path, val] ...)][json_set],<br/> [JSON_INSERT(json_doc, path, val[, path, val] ...)][json_insert],<br/> [JSON_REPLACE(json_doc, path, val[, path, val] ...)][json_replace],<br/> [JSON_REMOVE(json_doc, path[, path] ...)][json_remove] |
| [日期运算](/functions-and-operators/date-and-time-functions.md) | [`DATE_FORMAT()`](https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-format) |

## 禁止特定表达式下推

当函数的计算过程由于下推而出现异常时,可通过黑名单功能禁止其下推来快速恢复业务。具体而言,你可以将上述支持的函数或运算符名加入黑名单 `mysql.expr_pushdown_blacklist` 中,以禁止特定表达式下推。
[已支持下推的表达式列表](#已支持下推的表达式列表)中的函数和运算符,或特定的数据类型(**仅限** [`ENUM` 类型](/data-type-string.md#enum-类型)[`BIT` 类型](/data-type-numeric.md#bit-类型))的计算过程因下推而出现异常时,你可以使用黑名单功能禁止其下推,从而快速恢复 TiDB 业务。具体而言,你可以将函数名、运算符名,或数据列类型加入黑名单 `mysql.expr_pushdown_blacklist` 中,以禁止特定表达式下推。具体方法,请参阅[加入黑名单](#加入黑名单)

`mysql.expr_pushdown_blacklist` 的 schema 如下:

Expand All @@ -39,8 +39,8 @@ tidb> desc mysql.expr_pushdown_blacklist;

以上结果字段解释如下:

+ `name`:禁止下推的函数名。
+ `store_type`用于指明希望禁止该函数下推到哪些组件进行计算。组件可选 `tidb``tikv``tiflash``store_type` 不区分大小写,如果需要禁止向多个存储引擎下推,各个存储之间需用逗号隔开。
+ `name`:禁止下推的函数名、运算符名或数据类型
+ `store_type`用于指定希望禁止该函数、运算符或数据类型下推到哪些组件进行计算。组件可选 `tidb``tikv``tiflash``store_type` 不区分大小写,如果需要禁止向多个存储引擎下推,各个存储之间需用逗号隔开。
- `store_type``tidb` 时表示在读取 TiDB 内存表时,是否允许该函数在其他 TiDB Server 上执行。
- `store_type``tikv` 时表示是否允许该函数在 TiKV Server 的 Coprocessor 模块中执行。
- `store_type``tiflash` 时表示是否允许该函数在 TiFlash Server 的 Coprocessor 模块中执行。
Expand All @@ -54,19 +54,23 @@ tidb> desc mysql.expr_pushdown_blacklist;

执行以下步骤,可将一个或多个函数或运算符加入黑名单:

1.`mysql.expr_pushdown_blacklist` 插入对应的函数名或运算符名以及希望禁止下推的存储类型集合。
1.`mysql.expr_pushdown_blacklist` 插入以下内容:

- 希望禁止下推的[函数名、运算符名](#已支持下推的表达式列表)或数据类型(**仅限** [`ENUM` 类型](/data-type-string.md#enum-类型)[`BIT` 类型](/data-type-numeric.md#bit-类型)
- 希望禁止下推的存储引擎

2. 执行 `admin reload expr_pushdown_blacklist;`

### 移出黑名单

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

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

### 黑名单用法示例
### 黑名单使用示例

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

黑名单是否生效可以从 `explain` 结果中进行观察(参见[如何理解 `explain` 结果](/explain-overview.md))。

Expand All @@ -84,7 +88,7 @@ tidb> explain select * from t where a < 2 and a > 2;
+-------------------------+----------+-----------+---------------+------------------------------------+
3 rows in set (0.00 sec)

tidb> insert into mysql.expr_pushdown_blacklist values('<', 'tikv',''), ('>','tikv','');
tidb> insert into mysql.expr_pushdown_blacklist values('date_format()', 'tikv',''), ('>','tikv',''), ('bit','tikv','');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0

Expand Down
6 changes: 6 additions & 0 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -1690,3 +1690,9 @@ set tidb_slow_log_threshold = 200;
- 作用域:SESSION | GLOBAL
- 默认值:`ON`
- 这个变量用于控制计算窗口函数时是否采用高精度模式。
### `tidb_sysdate_is_now`(从 v6.0.0 版本开始引入)
- 作用域:SESSION | GLOBAL
- 默认值:`OFF`
- 这个变量用于控制 `SYSDATE` 函数能否替换为 `NOW` 函数,其效果与 MYSQL 中的 [`sysdate-is-now`](https://dev.mysql.com/doc/refman/8.0/en/server-options.html#option_mysqld_sysdate-is-now) 一致。

0 comments on commit 503f755

Please sign in to comment.