用于计算 Mysql 行最大大小的查询



>假设我有一个包含 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_FORMATsDYNAMIC可能是最适合您的。 (旧版本的MySQL没有Dynamic
  • 并行表(具有相同 PK 的两个表(
  • 规范化(将公共字符串替换为较小的 INT。
  • 不要使用一堆列作为"数组";创建另一个表。 (示例:3 个电话号码列。

你有没有达到任何INDEX极限? 闻起来你也可能被它咬伤。 写下CREATE TABLE,包括暂定索引。 我们会咀嚼它并为您提供建议。

最新更新