2012-09-28 20 views
1

我读过more nuanced responses到多少列是太多的问题,想请教一个跟进。计算并减少行的大小来解决有效的MySQL列的限制

我继承了一个相当混乱的项目(一个调查框架),但人们可以说,数据库的设计实际上是正确的正常化,即一个人真的有因为有问题的许多属性。
我不会捍卫这一概念的争论,但更迫切的一点是,我的时间很有限,我想帮助这个框架了,我能想到的最快的修复程序的用户现在正在降低行大小。我怀疑我有能力在我有的时候改变数据库模型。

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

然而,当我计算我行的大小我最终值低得多,因为几乎所有的列是TINYINTs(调查答复范围从1-12)。 它甚至不适用于2000 TINYINTs(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 

在行长计算中我误解了些什么?

+0

你的专栏是'question_1','question_2' ...或类似的东西?在其他表格的“问题”中提取这些列,并将其与M:M关系与“人员”表格链接起来。在'MySQL'中,你可以把这个表与第三个表'person_question_link'('link_id','person_id','question_id')联系起来 – doktorgradus

+0

@dokt谢谢你,但是我没时间了,恐怕。我很乐意做到这一点,但我正在寻找一个快速解决方案。我也想知道为什么我超出了行大小/列数限制。 – Ruben

+0

为了避免这样做,我几乎伤害了任何人,但是一个“修复”将会是一个多值的专栏。 –

回答

1

我忽略了这paragraph

因此,使用长列名可以减少 的最大列数,如可以包含ENUM或SET列,或使用的列 或表意见。

我有很长的列名,用连续的数字替换它们让我有更多的列(约2693),我将不得不看看增加是否足够。我不知道他们是如何保存的,大概是字符串,所以也许我可以用字母进一步减少它们。