MySQL:在一列中存储几个布尔值。一个tinyint(4)-vs-几个tinyint(4)

时间:2011-12-17 06:32:09

标签: mysql performance boolean tinyint

我需要在1个表中存储5个布尔值。 每个值都可以存储为tinyint(4)。所以,有5个tinyint(4)。 我想在一个tinyint(4)中放入5个布尔值。 我相信,每个人都比我更清楚,5位可以保存在1个字节中没有问题:) 第一个值可以存储为0(假)或1(真),第二个值可以存储为0(假)或2(真),第三个值可以存储为0或4,第四个值可以存储为0或8,第五个值可以存储为0或16。 因此,如果我们将这些值的总和存储在tinyint(4)中,我们确切地知道5个布尔值。

    For example, stored 21 -> 16 + 4+1.
So, if 21 is stored, we know that:
    Fifth=true
    Fourth=false
    Third=true
    Second=false
    First=true.

我的问题是: 仅保留1个变量是否有意义?我们赢得db volume(字节)和性能(少了4列,但这只有4个字节,而你实际上在同一个表中使用了varchar(1000)),但每次我们必须从“sum”中“提取”一个合适的布尔值“使用php功能,这种情况经常发生(假设当用户按下按钮时)。 将布尔值存储为1列中的总和是否都有意义,因此您有7列而不是11列?

这个值很清楚(因为那个表有更多的行只有2个),不是键。

谢谢。

3 个答案:

答案 0 :(得分:6)

不要这样做 - 除非值是单个“不透明”的外部数据类型,例如标志枚举 - if列永远将在查询中使用,或者永远在所述“不透明”类型之外使用:使用离散/单独字段。(正确的)类型,正如jmucchiello和MarkR在他们的答案中指出的那样。)

尝试“为了性能”这里只会让你厌倦数据库 - 特别是这个 - 当你必须“修复”它或者稍后解决这个丑陋的方案时。 (如果你遇到性能问题,你会知道它...... 知道足以在提出要求之前运行性能分析。)Donald Knuth说得对97%的东西只是不重要。所以让它漂亮,让数据库做你想做的事情。

快乐的编码。


如果我在上面发出动画,那是因为我正在尝试帮助别人避免我已经完成的相同错误遇到: - )

答案 1 :(得分:2)

不,这没有意义。

将每个存储在自己的列中,或者使用特定于MySQL的SET类型,它在内部使用位域,但更易于阅读。

担心每行几个字节真是个坏主意。这是一个令人难以置信的过早优化的案例。

答案 2 :(得分:1)

为什么不使用BIT Type让MySQL担心优化空间?