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