2011-12-17 63 views
3

我需要在一个表中存储5个布尔值。 每个值都可以存储为tinyint(4)。所以,有5个tinyint(4)。 我正在考虑将5个布尔值放在一个tinyint(4)中。 我相信,每个人都知道比我更好,5位可以被保存在1个字节,没有问题:) 第一个值可以存储为0(假)或1(真),第二为0(假)或2(真),第三个为0或4,第四个为0或8,第五个为0或16. 因此,如果我们将这些值的总和存储在tinyint(4)中,那么我们完全知道5个布尔值。MySQL:在一列中存储多个布尔值。一个tinyint(4)-vs-几个tinyint(4)

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个变量?我们赢得了数据库容量(字节)和性能(少了4列,但只有4个字节,而实际上在同一个表中使用了varchar(1000)),但是每次我们必须从“sum”中提取一个合适的布尔值“使用php函数,而且这经常发生(让我们说,当用户按下按钮)。 将布尔值作为总和存储在1列中是否有意义,所以你有7列而不是11列?

,价值观,这是明确的(因为该表有更多的行,仅仅2),都没有钥匙。

谢谢。

回答

6

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

在这里尝试“性能”会让你不满数据库 - 特别是这个 - 当你必须“修复”它时或者稍后在这个丑陋的计划中​​工作。 (如果你有性能问题,你就会知道它... 知道足够要求之前运行性能分析)高德纳是正确的,他指出,东西97%就无所谓。因此,让它变得漂亮,并让数据库按照自己的感觉进行操作。

快乐编码。


如果我的声音上面的动画,那是因为我想帮助别人避免同样的错误,我做运行进入:-)

1

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

+0

关于mysql.com,“位(M)大约需要(M + 7)/ 8个字节”。 (1 + 7)/ 8约为1个字节 - 与tinyint(4)相同。有什么不同? – Haradzieniec 2011-12-17 08:06:37

2

不,它没有任何意义。

要么存储每个在其自己的列,或使用MySQL特定SET类型,它在内部使用的位域,但更人类可读的。

担心每行的几个字节确实是一个坏主意。这是一个令人难以置信的不成熟优化的例子。

相关问题