大批量数据写入有什么优化

TiDB 用作数据仓库的话,是需要考虑批处理作业可能产生的大量结果数据写入的。 对这种情况有什么优化呢?

1 个赞

批量数据写入主要考虑热点问题: 1、 TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指的是 Region 的读写访问热点。而 TiDB 中对于 PK 非整数或没有 PK 的表,可以通过设置 SHARD_ROW_ID_BITS 来适度分解 Region 分片,以达到打散 Region 热点的效果。详情可参考官网 TiDB 专用系统变量和语法SHARD_ROW_ID_BITS 的介绍 2、可在写入前预切分 region,官网相关链接:https://pingcap.com/docs-cn/v3.0/reference/sql/statements/split-region/#split-region-使用文档

分区表也是一个可选的

3 个赞

赞,3.0 版本 分区表也是可选项

单个批次的行数不要太大,一两百左右一个事务。

@tminglei 不知道是否已经在使用 TiSpark 项目,如果已经在使用,可以看看 TiSpark batch write 的功能。

相关文档如下:

前几个回答应该默认走的是 JDBC/ODBC 接口吧,这个肯定够呛。 TiSpark 走的 TiKV 接口,性能应该会好些。

我提这个问题其实是想引发点讨论。 我用惯了 hadoop,这边数据写入是相当快的,因为它直接写文件。 不知道我们 TiDB 这边有没有考虑借鉴类似的思路?特别的,允许这种衍生数据只存在 TiFlash 版本,不写 TiKV(这应该是符合业务要求的,有些数据产生后压根就不会修改)。


我们曾经有过经历,通过 JDBC 往 Pg 里写几十万结果数据,半个多小时还没有写完;等不了,杀掉,做批量写优化,时间缩短到了 6~7 分钟;但改成写 Hive 的话,眨眼之间就完成了。 而其实这些结果数据的生成,才不过 1~2分钟。(虽然这里写的是 Pg,但换成 TiDB,用 SQL 接口写的话,应该也不会有质的差别。)

3 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。