TiDB 6.0 新特性解读 | TiFlash 新增算子和函数下推
作者: ShawnYan 原文来源:https://tidb.net/blog/2188d936
TiDB 6.0 对 TiFlash 的功能做了进一步增强,其中新增支持了 12 个函数和 2 个算子下推到 TiFlash 层的 MPP 引擎进行计算。
本文将对其逐一进行演示,以期快速、直观的展示这些新特性。
TiFlash 和 MPP 引擎
先来简要回顾一下相关概念。
TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展。
TiFlash 于 2022 年 4 月 1 日正式开源,主要功能包括列式存储提高分析查询效率,支持强一致性和实时性等,并提供了良好的隔离性。
TiFlash 的引入,为 MPP 架构提供了技术基础,MPP 架构解决了多表 JOIN 场景下的计算节点的扩展性与并行计算的问题。
TiFlash 通过在存储层分担计算下推,从而实现对 TiDB 的计算加速。
新增支持下推函数汇总
从 TiDB 6.0 的发版说明中可以清晰的看到,这次大版本迭代给 TiFlash 支持计算下推带来了进一步扩展,共计新增支持了 12 个函数,以及 2 个算子,原文如下。
支持下推 DAYNAME() 和 MONTHNAME() 函数到 TiFlash #32594
支持下推 REGEXP 函数到 TiFlash #32637
支持下推 DAYOFMONTH(),LAST_DAY() 函数到 TiFlash #33012
支持下推 DAYOFWEEK() 和 DAYOFYEAR() 函数到 TiFlash #33130
支持下推 IS_TRUE、IS_FALSE、IS_TRUE_WITH_NULL 函数到 TiFlash #33047
支持下推 GREATEST 和 LEAST 函数到 TiFlash #32787
算子:Anti Left Outer Semi Join, Left Outer Semi Join
从文档中提供的线索,我们可以反向推演,经寻找代码变更,汇总可知,主要对文件 expression.go
进行了修改,主要修改的代码如下。
已对代码进行了标注,增加了行数和相关 RP 号,以供参考。
将 TiFlash 6.0 新增算子对应的函数名、SQL 的函数名,按函数类型归类,总结成下表,更便于查阅和分析。
新增支持算子下推汇总
本次版本迭代新增支持了两个算子可以下推至 MPP 引擎,分别是 Left Outer Semi Join
和 Anti Left Outer Semi Join
。
中文表述为左外半连接(Left Outer Semi Join
)和反左外半连接(Anti Left Outer Semi Join
),半连接意为仅需要匹配第一行后就可以停止查询,而“反”则表示有不存在匹配值(即 NOT IN
)的情况。
查阅历史发版说明可知,在 TiDB 3.0 发版时,针对 NOT EXISTS
子查询进行优化,将其转化为 Anti Semi Join
#7842。而在 TiFlash 中的这两种 Join 都是基于 Hash Join 实现,对于大、宽表关联查询的场景,会比使用索引关联的效率更高。
新特性演示
TiDB 版本
准备测试表、数据
创建 TiFlash 数据副本,并强制开启 MPP 模式
日期函数
由上表可知本次迭代共涉及 6 个日期函数,下面将用 SQL 来做演示,从执行计划中可以看到已经支持函数下推到 TiFlash。后面演示过程以此类推。
字符串函数
REGEXP
在过滤条件中增加正则判定,过滤以 U
开头的数据。但是,这里收到了一条警告信息,当前不支持下推到 TiKV。
操作符
LEAST()
,GREATEST()
在过滤条件中增加最小值、最大值判断。
操作符
istrue_with_null
,istrue
,isfalse
判断结果真假。这三个操作符的官方文档内容较少,在准备文章的时候已提交了 Issue,相信官方会进行补充完善。
算子
Left Outer Semi Join
、Anti Left Outer Semi Join
新增支持下推的 2 个算子,上文新特性描述已做出阐释,下面这两条 SQL 的区别在于第二条语句使用了 NOT IN
。
使用建议
对于本文提及的支持计算下推的新特性已经正式发布,可以放心使用。
但是这里提示一个使用建议,即 GBK 字符集的表是不能同步到 TiFlash 的,会报下面这个错误。
也就是说,如果数据表使用了 GBK 字符集,就无法使用本文解读的这些新特性。
引申一步,从源码文件 charset.go
的 TiFlashSupportedCharsets
变量可知,目前 TiFlash 所支持的字符集有 UTF8, UTF8MB4, ASCII, Latin1, Binary
这 5 种。
所以,一般情况下,在创建数据表时,不建议使用 GBK 字符集。如果是迁移或重构项目,建议将数据转换为 UTF8mb4。
总结
本文对 TiFlash 新支持下推的函数和算子进行了汇总,并进行逐一演示。
从 TiDB v4 正式发布 TiFlash 组件,到 v5 引入 MPP 引擎,再到伴随 v6 的发布而正式宣布开源,TiFlash 已经逐步成熟,成为 TiDB 走向 HTAP 的关键组件。
期待 TiFlash 可以支持更多下推函数和算子。期望 TiFlash 可以运行得更快、更稳。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/946bde7518b4fd0dbd12ec608】。文章转载请联系作者。
评论