【问题标题】:Which is better to control state and perform queries with? One TINYINT column, one BIT(8) column or eight BIT(1) Columns哪个更好地控制状态和执行查询? 1 个 TINYINT 列、1 个 BIT(8) 列或 8 个 BIT(1) 列
【发布时间】:2011-06-25 22:07:27
【问题描述】:

我假装使用位图设置状态 (like this guy) 并对我的表进行按位查询。 我应该使用哪些列类型?我将如何执行选择?

This article 让我有点担心这个想法会落空。我希望能够为字段编制索引、进行连接以及我对普通字段所做的一切。

所以,如果我有一个带有线条的表格:

        |1234 5678|
|Id|Name|State    |
|01| xxx|0111 0001|
|02| yyy|1101 1001|
|03| zzz|0101 0011|

我想找回以下几行:

StateColumn 234 = 101 and StateColumn 8 = 1 
That would be => (0101 0001)

我应该取回 ID 为 02 和 03 的行。

进行这种搜索是个好主意还是我疯了?

【问题讨论】:

    标签: mysql database-design indexing bit-manipulation


    【解决方案1】:

    虽然位掩码方法除了给朋友留下深刻印象之外还有其他用途(可能会降低存储需求),但我强烈建议不要将其用于需要查询的数据。原因是你不能有效地索引它。大多数(如果不是所有)查询都必须使用完全扫描来解决。很久以前我真的被这个烧死了,因为我一个人在数据库中时在一个太小的数据集上测试了它。添加几十万行,十几个用户,它就是无法扩大规模。

    因此,除非您有一些特殊要求,否则我建议您将每条数据放在自己的列(位或整数)中,并根据您的查询需要将相应的索引(单列或复合列)放在一起。

    (在我看来是正确的)方法的“缺点”是增加了存储空间(由于单独的索引),但除非您有数百万行,否则几乎不会引起注意。

    如果由于某些原因对您不起作用,还有 其他选项可以利用数据中的模式来构建有效的搜索结构。但它们都是有代价的(灵活性严重受限、多用户环境中的锁定问题等等)。

    我的建议:将每条数据存储在它自己的列中。这就是数据库的使用方式,它将利用数据库的所有优点。除了最异常扭曲的情况外,这也恰好是所有情况下表现最好的方法。

    【讨论】:

    • 所以我应该分解我的 State 列,而不是让一个大的位掩码列在其位上表示不同类型的数据。可能以这个结尾:|0|000|000|0| 四位列,而不仅仅是一个。当然,对它们进行精心规划的索引,因为我重视速度而不是存储大小。我做对了吗?
    【解决方案2】:

    我希望能够索引字段, 做加入和我想做的一切 使用普通字段。

    “Do joins”表示您希望能够选择一个表中State列的第8位与另一表中状态列的第8位匹配的行。

    不要那样做。

    为每个不同的属性创建一个列。选择正确的数据类型。声明所有相关的完整性约束。索引正确的列。

    这样做,你可以选择并加入,直到奶牛回家。

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 2011-01-02
      • 2013-01-18
      • 2014-10-15
      • 1970-01-01
      • 2011-12-28
      • 2010-11-22
      • 2010-12-08
      相关资源
      最近更新 更多