下推到 TiKV 的表达式列表
下推到 TiKV 的表达式列表
当 TiDB 从 TiKV 中读取数据的时候,TiDB 会尽量下推一些表达式运算到 TiKV 中,从而减少数据传输量以及 TiDB 单一节点的计算压力。本文将介绍 TiDB 已支持下推的表达式,以及如何禁止下推特定表达式。
已支持下推的表达式列表
| 表达式分类 | 具体操作 |
|---|---|
| 逻辑运算 | AND (&&), OR (||), NOT (!) |
| 比较运算 | <, <=, =, != (<>), >, >=, <=>, IN(), IS NULL, LIKE, IS TRUE, IS FALSE, COALESCE() |
| 数值运算 | +, -, *, /, ABS(), CEIL(), CEILING(), FLOOR() |
| 控制流运算 | CASE, IF(), IFNULL() |
| JSON运算 | JSONTYPE(jsonval), JSONEXTRACT(jsondoc, path[, path] ...), JSONUNQUOTE(jsonval), JSON_OBJECT(key, val[, key, val] ...), JSON_ARRAY([val[, val] ...]), JSONMERGE(jsondoc, jsondoc[, jsondoc] ...), JSONSET(jsondoc, path, val[, path, val] ...), JSONINSERT(jsondoc, path, val[, path, val] ...), JSONREPLACE(jsondoc, path, val[, path, val] ...), JSONREMOVE(jsondoc, path[, path] ...) |
| 日期运算 | DATE_FORMAT() |
禁止特定表达式下推
当函数的计算过程由于下推而出现不被期待的行为时,可通过将其拉入黑名单禁止下推来快速恢复业务。具体来讲,可以将上述支持下推的表达式拉入黑名单 mysql.expr_pushdown_blacklist 中,以禁止其下推。
加入黑名单
执行以下步骤,可将一个或多个函数加入黑名单:
- 向
mysql.expr_pushdown_blacklist插入对应的函数名。 - 执行
admin reload expr_pushdown_blacklist;。
移出黑名单
执行以下步骤,可以将一个或多个函数移出黑名单:
- 从
mysql.expr_pushdown_blacklist表中删除对应的函数名。 - 执行
admin reload expr_pushdown_blacklist;。
表达式下推黑名单用法示例
以下示例首先将表达式 < 及 > 拉入黑名单,然后将表达式 > 从黑名单中挪出。
黑名单是否生效可以从 explain 结果中进行观察(参见如何理解 explain 结果)。
tidb> create table t(a int);
Query OK, 0 rows affected (0.01 sec)
tidb> explain select * from t where a < 2 and a > 2;
+---------------------+----------+------+------------------------------------------------------------+
| id | count | task | operator info |
+---------------------+----------+------+------------------------------------------------------------+
| TableReader_7 | 0.00 | root | data:Selection_6 |
| └─Selection_6 | 0.00 | cop | gt(test.t.a, 2), lt(test.t.a, 2) |
| └─TableScan_5 | 10000.00 | cop | table:t, range:[-inf,+inf], keep order:false, stats:pseudo |
+---------------------+----------+------+------------------------------------------------------------+
3 rows in set (0.00 sec)
tidb> insert into mysql.expr_pushdown_blacklist values('<'), ('>');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
tidb> admin reload expr_pushdown_blacklist;
Query OK, 0 rows affected (0.00 sec)
tidb> explain select * from t where a < 2 and a > 2;
+---------------------+----------+------+------------------------------------------------------------+
| id | count | task | operator info |
+---------------------+----------+------+------------------------------------------------------------+
| Selection_5 | 8000.00 | root | gt(test.t.a, 2), lt(test.t.a, 2) |
| └─TableReader_7 | 10000.00 | root | data:TableScan_6 |
| └─TableScan_6 | 10000.00 | cop | table:t, range:[-inf,+inf], keep order:false, stats:pseudo |
+---------------------+----------+------+------------------------------------------------------------+
3 rows in set (0.00 sec)
tidb> delete from mysql.expr_pushdown_blacklist where name = '>';
Query OK, 1 row affected (0.00 sec)
tidb> admin reload expr_pushdown_blacklist;
Query OK, 0 rows affected (0.00 sec)
tidb> explain select * from t where a < 2 and a > 2;
+-----------------------+----------+------+------------------------------------------------------------+
| id | count | task | operator info |
+-----------------------+----------+------+------------------------------------------------------------+
| Selection_5 | 2666.67 | root | lt(test.t.a, 2) |
| └─TableReader_8 | 3333.33 | root | data:Selection_7 |
| └─Selection_7 | 3333.33 | cop | gt(test.t.a, 2) |
| └─TableScan_6 | 10000.00 | cop | table:t, range:[-inf,+inf], keep order:false, stats:pseudo |
+-----------------------+----------+------+------------------------------------------------------------+
4 rows in set (0.00 sec)注意:
admin reload expr_pushdown_blacklist只对执行该 SQL 的 TiDB server 生效,若需要集群中所有 TiDB server 生效,需要在每台 TiDB server 上执行该 SQL 语句。- 表达式黑名单功能在 v3.0.0 及以上版本中支持。
- 在 v3.0.3 及以下版本中,不完全支持使用表达式原始名称文本(如 ">","+","is null")添加黑名单,部分表达式在黑名单中使用别名。已支持下推的表达式中,表达式别名与原始名不同的,对应关系见下表(不区分大小写)。
| 表达式原始名称 | 表达式别名 |
|---|---|
| < | LT |
| > | GT |
| <= | LE |
| >= | GT |
| = | 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 |