- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个表,其中包含大量长文本字段 (18) 以及许多其他各种整数和 varchar 字段。最近添加了一些额外的长文本字段,突然迫使我了解有关 8K 行大小限制的所有信息。数据库运行的是 Mysql 5.6.34,相关表当前为 Antelope/ROW_FORMAT=COMPACT。
我的理解是,在这种格式中,每列每行最多占用 768 个字节,直到溢出到单独的存储中。当太多的各种长文本获取大量数据时,这会导致我出现此错误:
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline. Ignoring the rest of the fields in the table, were all 18 longtexts at 768 bytes, then the primary index would be storing 13,824 bytes for all fields.
我尝试将表更新为 ROW_FORMAT=DYNAMIC,期望这会将长文本的溢出阈值从 768 字节降低到仅 20 字节,因此应将所有长文本字段的最大主索引存储要求降低到 18 * 20 = 360 字节。我尝试按照以下方式进行更新:
ALTER TABLE mytable ROW_FORMAT=DYNAMIC;
OPTIMIZE TABLE mytable;
没有错误并输出以下内容:
mydb.mytable optimize note Table does not support optimize, doing recreate + analyze instead mydb.mytable optimize status OK
如果我查看表的 CREATE TABLE 语法,我可以看到 ROW_FORMAT=DYNAMIC 已设置。
然后,我尝试编写一行来填充所有长文本列,每个列大约 5.7kb,但是在阻止保存该行之前我只能填充其中的 10 个,并且 10 * 768 = 7,680 字节,当考虑其他非长文本必填字段时,该字段非常接近 8kb 限制,表明 ROW_FORMAT=DYNAMIC 指令不适用于现有行。
我并不是特别希望通过转储/导入来重新创建数据库,但因为它特别大,并且会导致服务停机时间延长,我不确定在用尽其他选项之前是否可以证明这一点。
最佳答案
(这个答案虽然专注于索引,但很可能解决您的表问题。)
http://mysql.rjweb.org/doc.php/limits#767_limit_in_innodb_indexes
处理 767 限制有 5 种选择。这似乎就是您需要的
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_large_prefix=1;
logout & login (to get the global values);
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- (or COMPRESSED)
(升级到 5.7.7 或更高版本是另一种解决方案 - 但这仅将上述内容设置为默认值;我认为您仍然需要执行ALTER
。)
关于mysql - 如何将 ROW_FORMAT=DYNAMIC 应用于现有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51250156/
我是一名优秀的程序员,十分优秀!