下推到 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
中,以禁止特定表达式下推。具体方法,请参阅表达式下推黑名单。