单条sql大小限制

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

  • 【TiDB 版本】:2.1.7
  • 【问题描述】: tidb有配置可以限制单条Insert sql的大小吗,有人执行这种sql,insert into a values(x,x),(x,x)…(x,x)单条sql超级大,导致drainer往kafka发送binlog日记的时候被卡住。

您好, 关于大事务限制:

  • 单个事务包含的 SQL 语句不超过 5000 条(默认)
  • 每个键值对不超过 6 MB
  • 键值对的总数不超过 300000
  • 键值对的总大小不超过 100 MB

为了使性能达到最优,建议每 100~500 行写入一个事务。

详情请看官网:

  • 键值对的总大小不超过 100 MB,有配置可以修改这个条件吗,比如我想设置成 键值对的总大小不超过 10 MB

键值对是指一张表里有 2 个索引,那么一共就是数值 +2 个索引,总共 3 个键值对,那么每个键值对的总是不能超过 30 万 / 3 = 10 万。

一行数据会映射为一个 KV entry,每多一个索引,也会增加一个 KV entry,所以这个限制反映在 SQL 层面是:总的行数 * (1 + 索引个数) < 30w。

所以不建议调得太小,为了使性能达到最优,建议每 100~500 行写入一个事务。

另外使用 4.0 大事务模式,可以很好地解决你们的问题哦~
https://pingcap-incubator.github.io/tidb-in-action/session1/chapter6/big-txn-in-4.0.html

我想把一个事务里面建值对总大小从100mb改为10mb,有配置可以改这个条件吗,因为我们的表通过binlog kafka同步es的,kafka那边拒绝超过10mb的消息。主要是有同事执行insert into select * from语句产生大事务,导致kafka那边堵住。我想把100m改为10m与kafka那边匹配。

抱歉,建议根据需要调整 kakfka 的配置参数

message.max.bytes=1073741824
replica.fetch.max.bytes=1073741824
fetch.message.max.bytes=1073741824

Kafka那边因为一些其他业务原因改不了,Tidb这边提供了配置项修改吗?

  • 键值对的总大小不超过 100 MB 这个限制目前无法修改,在代码中限定的