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

Har*_*iec 3 mysql performance boolean tinyint

我需要在1个表中存储5个布尔值.每个值都可以存储为tinyint(4).所以,有5个tinyint(4).我想在一个tinyint(4)中放入5个布尔值.我相信,每个人都知道比我更好,5位可以被保存在1个字节,没有问题:)第一个值可以存储为0(假)或1(真),第二为0(假)或2( true),第三个为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.
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

小智 6

不这样做 -除非该值是一个单一的"不透明"外部数据类型,如标志的枚举- 如果列将永远在查询中使用,或将永远被说外使用"不透明" type:使用离散/单独的字段.(正确的类型,正如jmucchiello和MarkR在他们的答案中指出的那样.)

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

快乐的编码.


如果我在上面发出动画,那是因为我正在努力帮助别人避免犯同样的错误 DONE 遇到:-)