mysql - 哪个更好地控制状态和执行查询? 1 个 TINYINT 列、1 个 BIT(8) 列或 8 个 BIT(1) 列

标签 mysql database-design indexing bit-manipulation

我假装使用位图设置状态( 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 的行。

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

最佳答案

虽然位掩码方法除了给 friend 留下深刻印象之外确实还有一些用途(可能会降低存储要求),但我强烈建议不要在需要查询的数据上使用它。原因是您无法有效地对其进行索引。大多数(如果不是全部)查询都必须使用完整扫描来解决。很久以前我就对这个非常着迷,因为我在数据库中独自在一个太小的数据集上测试了它。添加几十万行、十几个用户,它只是无法扩展。

因此,除非您有特殊要求,否则我建议您将每条数据放在自己的列(bit 或 int)中,并根据您的查询需求添加适当的索引(单列或复合列)。

(在我看来正确的)方法的“缺点”是增加存储(由于单独的索引),但除非您有数百万行,否则很难注意到。

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

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

关于mysql - 哪个更好地控制状态和执行查询? 1 个 TINYINT 列、1 个 BIT(8) 列或 8 个 BIT(1) 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4975537/

相关文章:

lucene - 如何使用 Term 或 QueryParser 从 Lucene 索引中删除文档

mysql - 将对象列表作为变量存储在另一个对象中是否明智?

MySQL 一次计算多个列或单独的事务

mysql - 索引显示速度没有提高

mysql - 如何将表与许多其他表之一关联起来?

sql - 在 SQL Server 中,将时间和日期拆分为两个单独的日期列是最佳做法吗?

sql-server - SQL Server参数化查询不使用非聚集过滤

mysql - mysql 中获取员工最新时间列表的最佳查询是什么?

php - 在数据库中保存三级权限

indexing - 是否存在用于索引源代码文件的 IFilter?