【问题标题】:Calculate and minimize row size to get around effective MySQL column limit计算并最小化行大小以绕过有效的 MySQL 列限制
【发布时间】:2012-09-20 08:46:24
【问题描述】:

我已经阅读了more nuanced responses 中关于多少列太多的问题,并想提出跟进。

我继承了一个非常混乱的项目(一个调查框架),但有人可能会争辩说,数据库设计实际上是正确规范化的,即一个人的属性与问题的数量一样多。
我不会在辩论中为这个概念辩护,但更紧迫的一点是我的时间非常有限,我正在努力帮助这个框架的用户,我现在能想到的最快解决方法是减少行大小.我怀疑我是否有能力在我拥有的时间内更改数据库模型。

现在的列数是 4661,但他们有望将其减少到至少 3244,可能更少(通过减少实际问题数)。 硬列限制是 4096,但现在我什至没有成功添加 2500 列,大概是因为行大小限制为 65,535 字节。

但是,当我计算行大小时,我得到的值要低得多,因为几乎所有列都是 TINYINT(调查响应范围为 1-12)。 它甚至不适用于 2000 个 TINYINT (an example query that fails)。

使用 formula given in the documentation 我得到 4996 字节或更少。

column.lengths = tinyints * 1
null.columns = length(all.columns)
variable.lengths.columns = 0
(row.length = 1+
    (column.lengths)+ 
    (null.columns + 7)/8+ 
    (variable.lengths.columns)
)
## 4996

我在计算行长时误会了什么?

【问题讨论】:

  • 您的专栏是question_1question_2 ... 还是类似的?在其他表 questions 中提取这些列,并将其与您的 person 表的 M:M 关系链接。在MySQL 中,您可以将此表与第三个表person_question_link 链接(link_idperson_idquestion_id
  • @dokt 谢谢,但我没有时间做这些,我很害怕。我很想正确地做到这一点,但我正在寻找一个快速修复。我也想了解为什么我超出了行大小/列数限制。
  • 为了避免这样做,我几乎会伤害任何人,但一个“修复”将是一个多值列。
  • @Tony 调查答案可能会被逐一添加和检索,因此不一定是快速修复。关键还在于我没有编写整个框架并且它很混乱,如果我改变它的“原则”,会有很多未记录的影响。之前有人用这个框架做了一个 2000 列的调查,在我使用索引之后它表现还不错,我只是不明白我现在是如何遇到行大小限制的。
  • 一个个出来没问题,代码合理。即有一个 GetAnswer 方法。请注意,鉴于表格设计,我怀疑合理的可能不是对相应代码的完全准确描述。 :(

标签: mysql


【解决方案1】:

我忽略了这个paragraph

因此,使用长列名可以减少最大数量 列,也可以包含 ENUM 或 SET 列,或使用列 或表 cmets。

我的列名很长,用序号替换它们可以让我有更多的列(约 2693 年),我必须看看增加是否足够。我不知道它们是如何保存的,大概是作为字符串,所以也许我可以使用字母进一步减少它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 2015-08-08
    • 2021-07-12
    • 2021-10-04
    • 1970-01-01
    • 2022-10-14
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多