为了生成报告,我们有一些工程师将规范化的数据库结构展平到临时表中。列被指定为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?
Bil*_*win 19
您的问题的答案很复杂,因为它们因 InnoDB文件格式而异。今天,有两种格式,称为羚羊和梭子鱼。
中央表空间文件 (ibdata1) 始终采用Antelope格式。如果使用file-per-table,则可以通过在my.cnf 中进行设置,使单个文件使用Barracuda格式innodb_file_format=Barracuda。
基本要点:
一页 16KB 的 InnoDB 数据必须至少包含两行数据。此外,每个页面都有一个页眉和一个页脚,其中包含页面校验和和日志序列号等。这就是每行小于 8KB 的限制。
固定大小的数据类型(如 INTEGER、DATE、FLOAT、CHAR)存储在此主数据页上,并计入行大小限制。
可变大小的数据类型(如 VARCHAR、TEXT、BLOB)存储在溢出页上,因此它们不完全计入行大小限制。在 Antelope 中,除了存储在溢出页面上之外,最多 768 字节的此类列存储在主数据页面上。Barracuda 支持动态行格式,因此它可能只在主数据页上存储一个 20 字节的指针。
可变大小数据类型也以 1 个或更多字节为前缀来编码长度。InnoDB 行格式也有一个字段偏移数组。所以在他们的 wiki 中或多或少地记录了一个内部结构。[编辑]死链接-这里现在看起来更好。
Barracuda 还支持ROW_FORMAT=COMPRESSED以进一步提高溢出数据的存储效率。
我还必须评论说,我从未见过设计良好的表超出行大小限制。您违反了第一范式的重复组条件,这是一种强烈的“代码气味” 。
| 归档时间: |
|
| 查看次数: |
39988 次 |
| 最近记录: |