关于TiDB单行value size的计算问题

【 TiDB 使用环境】测试
【 TiDB 版本】v5.3.0
【遇到的问题:问题现象及影响】
Update时出现 entry too large 报错,查看文档后应该是事务数据量过大导致的,调整相关参数( txn-entry-size-limittxn-total-size-limitmax_allowed_packet)后也仍然报错,因为Update时写入的Blob长度已经超过了120MB的最大单行事务限制(378224214/(210241024)= 180.3MB)

这种情况下应该怎么样优化解决呢?能否通过改动TiDB参数实现呢?

另外在查看MySQL文档时我看到这么一段

  • The internal representation of a MySQL table has a maximum row size limit of 65,535 bytes, even if the storage engine is capable of supporting larger rows. BLOB and TEXT columns only contribute 9 to 12 bytes toward the row size limit because their contents are stored separately from the rest of the row.

看起来在计算行长度时Blob文件会被优化为一个类似于指针的变量,TiDB是否也会采取这种策略?如果采取,那按理来说我的操作时不可能能超出最大长度限制(不是宽表),如果未采取,是否有办法开启这种策略呢?

【附件:截图/日志/监控】
日志

[txn_mode=PESSIMISTIC] [err="[kv:8025]entry too large, the max entry size is 125829120, the size of data is 189200959

表结构

CREATE TABLE `table_optimizing_process` (
  ...
  `rewrite_input` longblob DEFAULT NULL COMMENT 'rewrite files input',
  ...
  PRIMARY KEY (`process_id`) /*T![clustered_index] CLUSTERED */,
  KEY `table_index` (`table_id`,`plan_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='History of optimizing after each commit';

SQL语句
UPDATE table_optimizing_process SET rewrite_input = ...(len: 378224214)

您是把数据库当成存储在用的高手

不能,只能修改程序了

业务方的需求,想了解一下能否有简单实现的可能 :joy:

好像titan是针对这种情况搞的,具体没研究过,你可以看看能不能行。

1 个赞

你这里是存纯文本吗 如果是存文件还是不要用lob大字段了,可以数据库里存地址用高性能存储保存文件接合起来用,如果存文本可以可以分表保存

只能应用层解决了

考虑拆分数据:如果可能的话,将大的 Blob 数据拆分为多个较小的部分进行存储和更新。这样可以绕过单行事务限制

如果你手动执行 是不是可以试试 UPDATE table_optimizing_process SET rewrite_input = xxx limit 100
分段update

已经给业务方说明了,他们会去拆分和压缩Blob,平台方确实没法支持

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