【问题标题】:MySQL: storing several boolean values in one column. One tinyint(4) -vs- several tinyint(4)MySQL:在一列中存储多个布尔值。一个 tinyint(4) -vs- 几个 tinyint(4)
【发布时间】:2011-12-17 06:32:08
【问题描述】:

我需要在 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 列?

很明显,这些值不是键。

谢谢。

【问题讨论】:

    标签: mysql performance boolean tinyint


    【解决方案1】:

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

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

    编码愉快。


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

    【讨论】:

      【解决方案2】:

      不,没有意义。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 关于 mysql.com,“bit(M) 大约需要 (M+7)/8 个字节”。 (1+7)/8 大约是 1 个字节 - 与 tinyint(4) 相同。有什么区别?
        • 在数据库应用程序中编写复杂的位操作函数有什么好处?让数据库处理存储。这是它的工作。
        • BIT 类型只占用 1 个字节,即使您有 8 个 BIT 列。所以你不能用你的自定义实现来击败它,因为 tinyint(4) 也需要 1 个字节。为什么不使用几个 BIT 列而不是使用 tinybit?
        猜你喜欢
        • 2012-10-18
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2011-04-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2017-02-19
        相关资源
        最近更新 更多