MySQL:行大小太大 (> 8126)

ham*_*oun 7 mysql innodb linux mysql-5.5

我有一个表,里面有 300 列。每列最多为255个字节(也就是这个企业的理由)。

当我尝试使用创建它时VARCHAR(255),我超过了最大字节数的限制。所以我创建的是使用 300 个TEXT字段。然后当我尝试插入数据时,出现错误:

行大小太大 (> 8126)。
将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。
在当前行格式中,内联存储 768 字节的 BLOB 前缀。

阅读完此内容后,我尝试通过指定ROW_FORMAT=COMPRESSED. 现在的问题似乎是,当我尝试使用该格式创建表时,出现相同的错误。

CREATE TABLE T_ObjLarge__c (Id VARCHAR(18), Name VARCHAR(80),
ObjLarge_Field_1__c TEXT,
ObjLarge_Field_2__c TEXT,
...
ObjLarge_Field_300__c TEXT
) ROW_FORMAT=COMPRESSED ;
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

行大小太大 (> 8126)。
将某些列更改为 TEXT 或 BLOB 可能会有所帮助。
在当前行格式中,内联存储 0 字节的 BLOB 前缀。

我在 Linux mint 上使用 MySQL 5.5.31。没有索引。我试过DYNAMIC格式;它的行为方式相同。

的输出SHOW GLOBAL VARIABLES LIKE 'innodb_file_per_table';

+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Barracuda |
| innodb_file_per_table    | ON        |
+--------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 4

这是一个非常难以回答的问题,因为您超出了 InnoDB 当前的限制。

你的问题绝不是独一无二的。之前已经在这里解决过这个问题

我还会研究您当前使用的字符集。

比尔·卡文(Bill Karwin)在他的最后一段中说得最好

我还必须评论说,我从未见过设计良好的表超出行大小限制。这是一种强烈的“代码味道”,表明您违反了第一范式的重复组条件。

您将必须定义更好的设计。没有任何商业理由可以证明它是合理的。为什么?

早在2011年7月20日,我回答了这个问题:Too much columns in MySQL

我亲眼目睹了这一点

在我作为开发人员的早期阶段,我于 1995 年在一家公司工作,其中 DB2 是主要的 RDBMS。该公司有一个包含 270 列、数十个索引的表,并且在检索数据时存在性能问题。他们联系了 IBM,并让顾问检查了他们系统的架构,包括这张单片表。该公司被告知“如果您不在未来 2 年内规范化该表,DB2 将在进行 Stage2 处理的查询(任何需要对非索引列进行排序的查询)上失败。” 这是向一家价值数万亿美元的公司告知的,目的是标准化 270 列的表。何况2000列的表呢。

具有 300 个 TEXT 列的表也会遇到同样的麻烦。

摘要:比尔·卡文(Bill Karwin)之前说过,我同意:重新设计表格。这肯定会避免行长度问题。