对于许多复选框,有多列或单列位字符串是否更好?

时间:2018-05-21 13:14:58

标签: mysql database-performance query-performance sqlperformance

我有以下情况:

包含许多复选框的表单,大约100个。

我有两个关于如何将它们保存在数据库中的想法:

1。多列

我创建一个看起来像这样的表:

id | box1 | box2 | ... | box100 | updated| created

id: int
box1: bit(1)


SELECT * FROM table WHERE box1 = 1 AND box22 = 1 ...

2。单数据列

表格简单:

id | data | updated | created

data: varchar(100)

SELECT * FROM table WHERE data LIKE '_______1___ ... ____1____1'

其中数据看起来像0001100101010......01,每个字符表示是否检查了值。

考虑到该表将有200k +行,这是一个更具可扩展性的解决方案?

3。 JSON

类型的单数据列

我还没有关于此的好消息。

1 个答案:

答案 0 :(得分:2)

或者...

<强> 4。一些SETs

<强> 5。一些INTs

  • 这些更加紧凑:每个字节大约有8个复选框。
  • 设置/测试它们有点乱。
  • 由于它们仅限于64位,因此您需要多个SETINT。我建议根据应用程序对这些位进行分组是合乎逻辑的方式。
  • 请注意FIND_IN_SET()
  • 请注意(1 << $n)创建值2^n
  • 请注意|&运营商。

5个中哪个最好?这取决于您需要运行的查询 - 搜索(如果需要?),插入,更新(如果需要?)和选择。

示例:对于INTsWHERE (bits & 0x2C08) = 0x2C08会同时检查4个标记是否为“开启”。该常量可以在应用代码中构建,也可以在{3}中为位3,10,11,13构建。同时,其他标志被忽略。如果您需要它们“关闭”,则测试将为((1<<13) | (1<<11) | (1<<10) | (1<<3))。如果这些测试中的任何一种都是您的主要活动,那么选择5可能是性能和空间的最佳选择,尽管读起来有点神秘。

添加其他选项时,WHERE bits ^ 0x2C08 = 0需要SETALTER TABLE 通常有一些备用位(INT有8位,... TINYINT UNSIGNED有64位)。因此,在8中大约一次,你需要一个BIGINT UNSIGNED来获得更大的INT或添加另一个INT。删除选项:建议放弃该SET元素或INT位。