【问题标题】:Query to calculate Mysql row max size查询以计算 Mysql 行最大大小
【发布时间】:2020-02-10 13:47:16
【问题描述】:

假设我有一个包含 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
about 字段的大小被忽略,因为类型是 TEXT。

【问题讨论】:

  • 您可以查询INFORMATION_SCHEMA.COLUMNS。使用DATA_TYPECHARACTER_MAXIMUM_LENGTH 列。
  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 我不认为有任何内置的东西会返回数据类型的大小。您可以使用CASE 表达式或创建您自己的将类型名称映射到大小的表。
  • 20*8 BIGINT(20) 不是 20 个 BIGINT... :)
  • @Akina 你说得对,谢谢

标签: mysql byte size row utf8mb4


【解决方案1】:

这要简单得多——编写并运行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,包括暂定索引。我们会仔细研究并为您提供建议。

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2016-01-12
    • 2013-04-26
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多