TiDB 数据库的存储文件密度太低和体积过大

【 TiDB 使用环境`】测试环境

【 TiDB 版本】v6.1.0

【遇到的问题】
TiDB数据库,导入100W数据,文件系统占用体积增长了20GB,数据量和对应文件体积太过悬殊。
而相同数据量,MySQL数据库的文件体积只用两1.5GB。

【复现路径】做过哪些操作出现的问题

【问题现象及影响】
TiDB数据库,导入100W数据,文件系统占用体积增长了20GB,数据量和对应文件体积太过悬殊。
而相同数据量,MySQL数据库的文件体积只用两1.5GB。
TiDB的社区版本,使用文件系统存储数据,文件存储密度太低,文件体积增长太快。

【附件】
TiDB 单节点伪集群,数据文件系统占用大小

TiDB单节点伪集群,实际插入数据行数100W
%E5%9B%BE%E7%89%87

表结构,字段很少,一行数据体积也不大

TiDB单节点伪集群,信息如下

  1. Mysql 是单副本, tidb 是多副本,你配置的表设定了几个副本?
  2. 数据有压缩比的,你可以按照资源计算的能力,配置压缩能力
  3. 适应的场景不一样,这样比对意义不太大,如果是单机环境,大可使用 Mysql 即可
1 个赞

首先要考虑多副本,比如默认3副本那就要放大3倍空间。然后要考虑MVCC多版本,它不像MySQL是用undo来实现的,TiDB中同一行数据的不同版本,在RocksDB中都是不同的KV对,需要等待GC去删除旧的快照数据,删除后空间会有所下降。最后还要考虑RocksDB的7层LSM Tree结构的空间放大,大约是1.12倍。

1 个赞

谢谢你的解答,有没有官方教材,如何优化配置TiDB数据库的数据库文件体积压缩比和缩小存储。

因为100W的数据量,存储文件系统占用了20GB,这个实在是无法在生产环境使用。

还是我按照官网配置教材部署的,中间有啥遗漏吗?

按照官方教材,配置的1PD + 3TiKV + 1 TiDB.

https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb#在单机上模拟部署生产环境集群

那只是一个验证而已,如果要做 POC,要参考官方提供的配置要求
另外你提到的其他的资料,官方文档中都有详细的描述,但是十分多,要看完需要花比较多的时间和精力

1 个赞

谢谢你的热心回复,我就有一个疑问,大伙实际生产使用中,如果按照三副本等方式存储TiDB数据,

会有我上面实验数据100W条,在TiDB数据库文件系统中占用20GB的情况吗?

这个是否是TiDB自身社区版本的特性呢?还是我配置有误?

在单机上模拟部署生产环境集群
https://docs.pingcap.com/zh/tidb/stable/quick-start-with-tidb#在单机上模拟部署生产环境集群

备注:我测试环境,用的虚拟8vCPU, 36GB内存,320GB SSD。

  1. Mysql 是 B+ 树的实现, tidb 是 lsm 树的实现,在实现上就有很大的差距
  2. 在追求高写入的过程,肯定会存在写放大的,这个是已知的问题,并不是未知的
  3. 如果分表分库也能满足你的场景,不需要弹性化扩缩容,可以不考虑 tidb
  4. 建议全面进行 POC ,再来考虑是否符合你的要求
1 个赞

我也是单机配置过3副本TiKV+1TiFlash加其他默认配置的东西,插入几十万条数据,然后看所有region总大小应该也差不多1~2个G,文件增加的占用大概是3~4G,但是文件夹总大小在集群启动之后自然增加了50多G;
部署前文件夹大小




部署集群

启动集群后

按照https://docs.pingcap.com/zh/tidb/dev/sql-statement-show-table-regions插入测试数据

可以看到大概4个region,每个大小约100MB,算上3副本,总大小应该1.2G左右
现在文件系统占用增加了3GB

1、可以等GC触发并执行过compaction过后,再去关注文件体积
2、可以用如下脚本估算一下表在TiDB中的大小
https://docs.pingcap.com/zh/tidb/stable/manage-cluster-faq#如何预估-tidb-中一张表的大小
3、可以通过调整如下参数控制RocksDB每层使用的压缩算法,不过一般不太建议去调整
https://docs.pingcap.com/zh/tidb/stable/tikv-configuration-file#compression-per-level
4、可以在Grafana上PD -> Statistics - Balance页面的Size amplification图上看到空间放大率