我有几个问题要问那些更熟悉的人。尽管支持 Barracuda,但我的大多数实例都在运行 Antelope。
我正在寻找一些压缩 innodb 表的方法。我的理解是这仅在 Barracuda 格式下可用。
从我读过的和从我的测试中收集到的答案是:是的。是的。我不知道。
更新
自从这篇文章以来,我一直在各种情况下运行一些动态表和一些压缩表,没有出现问题。此外,我 当时忽略了阅读http://dev.mysql.com/doc/refman/5.5/en/innodb-file-format-identifying.html。
启用给定的 innodb_file_format 后,此更改仅适用于新创建的表而不是现有的表。如果您确实创建了一个新表,则包含该表的表空间将使用该表功能所需的“最早”或“最简单”文件格式进行标记。例如,如果您启用文件格式 Barracuda,并创建一个未压缩且不使用 ROW_FORMAT=DYNAMIC 的新表,则包含该表的新表空间将被标记为使用文件格式 Antelope。
因此,即使您允许 Barracuda,表也将创建为 Antelope。混合是不可避免的,除非您将每个表指定为 row_format 动态或压缩表。
没有迹象表明您应该在引入第一个 Barracuda 表时进行完整的转储和重新加载(例如在升级 mysql 的主要版本时推荐)
为了生成报告,我们有一些工程师将规范化的数据库结构展平到临时表中。列被指定为TEXT NOT NULL
(我知道“他们为什么这样做?”;让我们假设我们正在解决这个问题)。
我们在 Linux 上使用 MySQL 5.1.48 Community RHEL5 和 InnoDB 插件 1.0.9。
使用 MyISAM 时,我们从未遇到过最大列数或最大行长度的表大小限制(在调查期间,我们已达到最大列数限制为 2598(第 2599 个导致错误 1117)。使用 InnoDB 我们达到了限制。这些限制在创建表(无数据插入)为:
第 1 行的错误 1118 (42000):行大小太大。所用表类型的最大行大小(不包括 BLOB)为 8126。您必须将某些列更改为 TEXT 或 BLOB
我正在寻找以下问题的答案:
使用大量 v/v/b/t 列时确定行大小的详细公式是什么?我已经尝试了一些不同的公式,使用varchar(N)
列(其中 N 介于 1 和 512 之间)、UTF8 字符集 (*3) 以及表将采用的列数,直到失败。我尝试过的所有组合都没有给出与实际测试结果相匹配的值。
在计算行大小时,我还必须考虑哪些其他“开销”?
当我从使用 varchar(109) 列创建表到 varchar(110) 列时,为什么错误消息从 8126 更改为 65535?
我有一个表,里面有 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';
:
+--------------------------+-----------+ …
Run Code Online (Sandbox Code Playgroud)