3

我需要在 1 个表中存储 5 个布尔值。每个值都可以存储为 tinyint(4)。所以,有 5 个 tinyint(4)。我正在考虑将 5 个布尔值放入一个 tinyint(4) 中。相信大家都比我更清楚,1个字节可以保存5位是没有问题的:)第一个值可以存储为0(false)或1(true),第二个值可以存储为0(false)或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.

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

很明显,该值不是键(因为该表的行数要多得多,只有 2 行)。

谢谢你。

4

3 回答 3

6

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

在这里尝试“为了性能”只会让你讨厌数据库——尤其是这个数据库——当你必须“修复”它或稍后解决这个丑陋的方案时。(如果你有性能问题,你会知道的......并且知道的足够多,可以在询问之前进行性能分析。) Donald Knuth 是正确的,他指出 97% 的东西只是无关紧要。所以让它变得漂亮,让数据库做它想做的事情。

快乐编码。


如果我在上面听起来很生动,那是因为我正在努力帮助其他人避免与我相同的错误完毕遇到:-)

于 2011-12-17T07:01:54.300 回答
2

不,这没有意义。

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

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

于 2011-12-17T07:40:25.203 回答
1

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

于 2011-12-17T07:03:42.830 回答