确认TiDB单行最大长度限制

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:v4.0.8
  • 【问题描述】:确认TiDB单行最大长度限制,看到文档可能有冲突
    在官方文档的两处发现了对单行长度的描述:
  1. https://docs.pingcap.com/zh/tidb/stable/tidb-limitations
    image

  2. https://docs.pingcap.com/zh/tidb/stable/loader-overview#解决方案

这两个看起来描述上面有冲突?以哪个为准?另外TiDB里面对所提到的「宽表」(目前最新版支持4096列,没有看到有特别的地方提到宽表),是如何界定的?

2赞

以单行 6MB 限制为准,loader 中关于 64M 的限制,我理解是 sql 文本中插入语句是 insert into values(),(),()… 的形式,单个 insert 语句可能超过 64M,这边描述我们修改一下,避免误解。

宽表只是字面意义上的字段数量比较多的表,对于如何判定是宽表还是窄表没有明确的划分分界线。我个人会把 50 或者 100 个字段以上的表理解为宽表。

您好,单行限制6MB指的是一行所有列的数据加起来不能超过6MB吗?单列限制6MB具体又指的是什么?

单行 6MB 限制指的是一行所有列的数据加起来不能超过 6MB
单列 6MB 的限制也是基于此,如果一个表只有一个列,因为一行数据不能超过 6MB ,那也就是单个列不能超过 6MB。

懂了,也就是理论上一列的最大容量不能超过6MB

嗯是的

为什么单行限制 6MB ?

是为了防止 value 过大,LSM-Tree 里 value 过大,在 compaction 下会有写放大的问题。

至于为什么是 6MB 这个值,可能是因为,在 TiKV Raft 层也限制了 value 的大小,上限为 8MB,所以单行必须得小于这个值吧。