>假设我有一个包含 5 个字段的数据库表。
id bigint(20)
name varchar(255)
place varchar(255)
DOB date
about TEXT
MySQL 中的最大行大小为 65535 字节,在表中除 TEXT/BLOB 列外的所有列之间共享。
我需要一个查询,它将为我提供此表的最大行大小(以字节为单位(,以便我可以检查最大大小是否超过 65535。使用的字符集是 utf8mb4。我需要这样的东西
(20*8 + 255*4 +255*4 + 3( = 2203
"关于"字段的大小将被忽略,因为类型为 TEXT。
它要简单得多 -- 编写并运行CREATE TABLE
语句。 如果它太大,它会向你吐口水。
同时,以下是您尝试中的一些缺陷:
-
BIGINT
是8个字节;(20)
是无用的信息。 -
每个
VARCHAR
需要 1 或 2 个字节的长度字段。 -
TEXT
需要一些空间才能达到 64K 限制。
每一 列和每一行都有一堆"开销",所以尝试计算长度真的是不切实际的。
另请注意 -- 当长度变得太大时,某些
VARCHARs
可能会被视为TEXT
。 也就是说,它们不一定计入 64K 限制。 但是,它们会在原处留下一个 20 字节的指针。
如果您想拥有一个包含太多太大列的表,请向我们描述该表;我们可以提出改进建议,例如:
- 很少需要
BIGINT
;使用较小的 int 类型。 - 不要盲目使用
(255)
有几个缺点。 分析数据并选择更现实的限制。 - 请注意,有四种
ROW_FORMATs
。DYNAMIC
可能是最适合您的。 (旧版本的MySQL没有Dynamic
。 - 并行表(具有相同 PK 的两个表(
- 规范化(将公共字符串替换为较小的 INT。
- 不要使用一堆列作为"数组";创建另一个表。 (示例:3 个电话号码列。
你有没有达到任何INDEX
极限? 闻起来你也可能被它咬伤。 写下CREATE TABLE
,包括暂定索引。 我们会咀嚼它并为您提供建议。