过滤器的数据库性能是整数还是布尔值?

时间:2014-12-08 16:54:22

标签: java sql dao

我将拥有一个包含数百万条目的数据库表,例如在线商店的产品。 如果有一个缺货,我想以某种方式标记它,我想将它从任何findAll() sql提取中排除。

因此我通过以下选项之一:

  • 每个产品已有整数可用性。无论如何我必须设置= 0. select * from products where availcount > 0
  • 或者我可以引入boolean available = 'true'字段,如果缺货我将其设置为false,然后查询将为...where available = 'true'

问题:这会有什么不同吗?是否有理由选择其中一种选择?

3 个答案:

答案 0 :(得分:2)

我会坚持库存水平(int availcount)。位字段通常非常difficult to index,除非数据存在大量偏差,因此缺货产品的数量为1%或更少(因为您可能只会搜索库存产品) ,标志上的任何索引都将被闲置。)

由于您似乎已经存储了实际库存水平,因此不将available存储在库存指示器中会让您在尝试保持两列同步时感到头痛。

最后,许多RDBMS允许您添加COMPUTED列(或者失败,将available指示符添加到VIEW),这将允许您从实际{available指示符的逻辑推导1}},没有任何存储开销。

修改

  • 根据以下评论,请注意availcount上的索引(对于查询availcountWHERE availcount = 0)将同样取消 - SARGable作为索引如果产品通常按其他标准搜索,则可能不需要索引。
  • 除了在数据库中导出availcount > 0之外,还可以在代码中进行此确定,例如您的实体类上的其他is available in stock ?方法。

答案 1 :(得分:0)

如果您已经拥有availcount列,则没有理由添加新的列,您的availcount > 0会这样做。 如果由于其他原因不需要计数,并且只是想在计数或布尔值之间做出决定,请考虑更新该列而不是过滤有多难。

如果你只有一个布尔值,你只需要在产品缺货(或重新进入)时触摸。计算更复杂:每次进行销售或重新进货时都需要更新。这更复杂,可能会影响性能,还有一些需要关注的案例。所以,除非你需要将计数用于其他目的,否则最好坚持使用布尔值。

答案 2 :(得分:0)

我认为只要在相关列中有索引,这两个选项在SELECT上同样有效。

索引availcount对此列的任何更新都会有一个小的惩罚(我想这个列会经常更新)。另一方面,拥有available列会为您的数据库添加冗余(即,它不会被规范化),您可能希望避免这种情况。