计算并最小化行大小以绕过有效的MySQL列限制

时间:2012-09-28 12:56:29

标签: mysql

我已经阅读了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

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

1 个答案:

答案 0 :(得分:1)

我忽略了这个paragraph

  

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

我有很长的列名,用序号替换它们让我有更多的列(约2693),我将不得不看看增量是否足够。我不知道他们是如何得救的,可能是作为字符串,所以也许我可以使用字母进一步减少它们。