auto_random作为主键的大表数据导入效率

【 TiDB 使用环境】生产环境
【 TiDB 版本】
【复现路径】生产有几张表,每张表3-5亿行数据,需要迁移到tidb的auto_random主键的表。看热力图确实没有热块,但是4个线程插入,每2w行数据花50-60秒,这样的效率似乎不是很高。
【遇到的问题:问题现象及影响】
有没有插入效率提升空间?现在已经知道每张表大概200G数据(ORACLE空间),折算到tidb大概30G,那么按照96M一个表计算,大概有100多个region。auto_random主键可以提前分配region吗?这样的话是不是就不需要split浪费时间?

看看这俩:
https://docs.pingcap.com/zh/tidb/stable/tune-tikv-thread-performance
https://docs.pingcap.com/zh/tidb/stable/high-concurrency-best-practices

1、auto_random是为了后面Region达到分裂阈值的时候分裂成多个Region,从而避免大数据量导入时一直往一个Region顺序写入,从而减少热点;但是一开始,Region还没有分裂之前,还是会有热点,因为一直往一个Region上写入,这种情况可以通过导入前预先设置几个Region避免;
2、至于导入效率慢的问题,你使用的是Lightning导入?使用的是TiDB模式还是Local模式?

检查并调整TiDB、PD以及TiKV的相关参数,比如raftstore.region-split-check-diff, raftstore.region-split-size, tidb_distsql_scan_concurrency等,适应大规模数据导入的需求。

哦,谢谢。大公司一般开发和运维是分离的。我是负责开发。有没有办法可以在session 层面调整参数就可以提高导入效率的?底层的参数一般不敢调整。一会技术不够,影响了其它用户或者应用就麻烦了。

你用什么方式导入的?我用navicate数据传输多开几个窗口,都能跑几万每秒

可以提前分配 region,让压力均匀的落到各个 TiKV 节点,也避免在写入中产生热点,https://docs.pingcap.com/zh/tidb/stable/sql-statement-split-region

用什么方式导入的

这个还真不懂,看看其他高手

在 TiDB 中,使用 AUTO_RANDOM 主键可以有效避免热点问题,但你提到的插入效率问题可能涉及多个方面,包括参数配置、并发插入策略和硬件资源利用等。下面是一些提升插入效率的建议和方法:

1. 提前分配 Region

虽然 TiDB 会自动进行 Region 分裂和调度,但在大量数据插入的场景下,提前手动分裂 Region 可以减少运行时的分裂开销。你可以使用 SPLIT REGION 命令来预先分裂 Region。

例如,对于一个表 my_table,你可以执行以下命令:

sqlCopy Code

-- 假设 AUTO_RANDOM 的列名为 id
SPLIT TABLE my_table BY (0), (50000000), (100000000), (150000000), ...;

这将根据 id 列的值预先分裂 Regions,减少插入过程中的分裂开销。

2. 增加并发度

4 个线程的并发度可能不足以充分利用集群资源。你可以尝试增加并发度,例如使用更多的客户端连接和线程来进行插入操作。确保每个线程的任务尽量均衡分布,避免单个线程成为瓶颈。

3. 使用批量插入

批量插入可以显著提升插入效率。尽量一次性插入较大的批次数据,而不是一行一行地插入。例如,将每次插入的数据量调整为 1000 行或更大,具体取决于你的网络和数据库配置。

4. 调整 TiDB 配置

  • TiDB 配置:调整 TiDB 的相关配置参数,例如 txn-total-size-limit,确保它足够大以支持批量插入。你可以在 tidb.toml 文件中进行配置。

tomlCopy Code

[performance]
txn-total-size-limit = 104857600  # 100MB
  • TiKV 配置:调整 TiKV 的相关配置参数,例如 raftstore.sync-log 设置为 false,提高写入性能,但需要注意这会影响一致性和安全性。

tomlCopy Code

[raftstore]
sync-log = false

5. 硬件资源检查

确保你的集群硬件资源(CPU、内存、磁盘 I/O 等)没有成为瓶颈。如果某个节点资源耗尽,会导致整体性能降低。你可以使用监控工具如 Prometheus + Grafana 来监控集群状态。

6. 网络优化

如果你的插入操作是通过网络进行的,确保网络带宽和延迟不会成为瓶颈。优化网络配置,减少网络延迟,提高带宽利用率。

7. 合理的索引设计

确保你的表上只有必要的索引,因为每个索引都会增加插入的开销。避免过多的或复杂的索引设计。

8. 事务大小

控制事务的大小和记录数,避免单个事务过大导致的锁等待时间过长。你可以逐步调整每个事务的记录数,找到最佳插入效率。

9. 优化参数示例

以下是一些关键参数的示例配置,可以适当调整以提升插入性能:

tomlCopy Code

# tidb.toml
[performance]
max-txn-duration = "60s"
max-txn-ttl = 3600000
txn-total-size-limit = 104857600

[log]
level = "warn"

# tikv.toml
[raftstore]
sync-log = false
apply-pool-size = 4
store-pool-size = 4

[rocksdb]
max-sub-compactions = 3
2 个赞

先给你优秀,是否可以补充一下。怎么看grafana判断现在是否还可以拉起其它线程一起并发导入数据?

补充下硬件配置吧。感觉你的服务器硬件配置一般 :thinking:

学习了,谢谢。