下推到 TiKV 的表达式列表

当 TiDB 从 TiKV 中读取数据的时候,TiDB 会尽量下推一些表达式运算到 TiKV 中,从而减少数据传输量以及 TiDB 单一节点的计算压力。本文将介绍 TiDB 已支持下推的表达式,以及如何禁止下推特定表达式。

TiFlash 也支持本页列出的函数和算子下推。

已支持下推的表达式列表

表达式分类具体操作
逻辑运算AND (&&), OR (||), NOT (!), XOR
位运算&, ~, |, ^, <<, >>
比较运算<, <=, =, != (<>), >, >=, <=>, BETWEEN … AND …, COALESCE(), IN(), INTERVAL(), IS NOT NULL, IS NOT, IS NULL, IS, ISNULL(), LIKE, NOT BETWEEN … AND …, NOT IN(), NOT LIKE, STRCMP()
数值运算+, -, *, /, DIV, % (MOD), -, ABS(), ACOS(), ASIN(), ATAN(), ATAN2(), ATAN(), CEIL(), CEILING(), CONV(), COS(), COT(), CRC32(), DEGREES(), EXP(), FLOOR(), LN(), LOG(), LOG10(), LOG2(), MOD(), PI(), POW(), POWER(), RADIANS(), RAND(), ROUND(), SIGN(), SIN(), SQRT()
控制流运算CASE, IF(), IFNULL()
JSON 运算JSON_ARRAY([val[, val] …]),
JSON_CONTAINS(target, candidate[, path]),
JSON_EXTRACT(json_doc, path[, path] …),
JSON_INSERT(json_doc, path, val[, path, val] …),
JSON_LENGTH(json_doc[, path]),
JSON_MERGE(json_doc, json_doc[, json_doc] …),
JSON_OBJECT([key, val[, key, val] …]),
JSON_REMOVE(json_doc, path[, path] …),
JSON_REPLACE(json_doc, path, val[, path, val] …),
JSON_SET(json_doc, path, val[, path, val] …),
JSON_TYPE(json_val),
JSON_UNQUOTE(json_val),
JSON_VALID(val)
日期运算DATE(), DATE_FORMAT(), DATEDIFF(), DAYOFMONTH(), DAYOFWEEK(), DAYOFYEAR(), FROM_DAYS(), HOUR(), MAKEDATE(), MAKETIME(), MICROSECOND(), MINUTE(), MONTH(), MONTHNAME(), PERIOD_ADD(), PERIOD_DIFF(), SEC_TO_TIME(), SECOND(), SYSDATE(), TIME_TO_SEC(), TIMEDIFF(), WEEK(), WEEKOFYEAR(), YEAR()
字符串函数ASCII(), BIT_LENGTH(), CHAR(), CHAR_LENGTH(), CONCAT(), CONCAT_WS(), ELT(), FIELD(), HEX(), LENGTH(), LIKE, LTRIM(), MID(), NOT LIKE, NOT REGEXP, REGEXP, REPLACE(), REVERSE(), RIGHT(), RTRIM(), SPACE(), STRCMP(), SUBSTR(), SUBSTRING()
聚合函数COUNT(), COUNT(DISTINCT), SUM(), AVG(), MAX(), MIN(), VARIANCE(), VAR_POP(), STD(), STDDEV(), STDDEV_POP, VAR_SAMP(), STDDEV_SAMP(), JSON_ARRAYAGG(key), JSON_OBJECTAGG(key, value)
加密和压缩函数MD5(), SHA1(), SHA(), UNCOMPRESSED_LENGTH()
Cast 函数CAST(), CONVERT()
其他函数UUID()

禁止特定表达式下推

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