Java 按整数或布尔值筛选的数据库性能?

Java 按整数或布尔值筛选的数据库性能?,java,sql,dao,Java,Sql,Dao,我将有一个数据库表,其中有几百万个条目,例如网上商店的产品。 如果其中一个缺货,我希望以某种方式标记它,并将其从任何findAll()sql获取中排除 因此,我考虑了以下选项之一: 每个产品的可用性都有一个整数计数。无论如何,我必须把它设为0从availcount>0的产品中选择* 或者我可以引入一个boolean available='true'字段,如果缺货,我会将该字段设置为false,然后查询将是…如果可用='true' 问:这会有什么不同吗?是否有理由优先选择这些选项之一?我会坚持

我将有一个数据库表,其中有几百万个条目,例如网上商店的产品。 如果其中一个缺货,我希望以某种方式标记它,并将其从任何
findAll()
sql获取中排除

因此,我考虑了以下选项之一:

  • 每个产品的可用性都有一个整数计数。无论如何,我必须把它设为0<代码>从availcount>0的产品中选择*
  • 或者我可以引入一个
    boolean available='true'
    字段,如果缺货,我会将该字段设置为false,然后查询将是
    …如果可用='true'

问:这会有什么不同吗?是否有理由优先选择这些选项之一?

我会坚持股票水平(
int availcount
)。位字段通常非常重要,除非数据中存在大量的倾斜,导致缺货的产品约为1%或更少(而且由于您可能只搜索库存产品,因此标记上的任何索引都将不使用)

由于您似乎已经在任何情况下存储了实际库存水平,因此在库存指示器中不存储
available
将省去您保持两列同步的麻烦

最后,许多RDBMS允许您添加计算列(如果没有,则将
available
指示符添加到视图),这将允许您从实际
available
指示符逻辑推导
available
指示符,而无需任何存储开销

编辑

  • 根据下面的评论,请注意,
    availcount
    (对于availcount=0和
    availcount>0
    的查询)上的索引将与位字段上的索引相同,尽管如果产品通常按其他条件搜索,则可能不需要索引
  • 除了在数据库中导出可用的
    之外,还可以在代码中进行此确定,例如,实体类上的附加
    bool isAvailable(){return availcount>0;}
    方法

如果您已经有了availcount列,那么没有理由添加新列,您的
availcount>0
就可以了。 如果您不需要其他原因的计数,而只是试图在计数或布尔值之间进行选择,那么考虑更新该列而不是过滤会有多困难。
如果您只有一个布尔值,那么您只需要在产品缺货(或重新进货)时进行触摸。计数更为复杂:您需要在每次销售或重新进货时更新计数。这更为复杂,可能会影响性能,并且需要关注一堆或一个角落的案例。因此,除非您出于其他目的需要计数,否则最好还是使用布尔值。

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


索引
availcount
会对本专栏的任何更新产生一点影响(我猜本专栏会经常更新)。另一方面,拥有可用的
列将为您的数据库增加冗余(即,它不会被规范化),这是您可能希望避免的。

您正在使用的数据库。虽然布尔字段上的索引通常不是非常有效,但其(in)效率与
int
列索引相同,用于支持查询,如
其中count>0
确实是。如果决定索引
availcount
,则在狭窄的
availcount
范围内(例如,availcount在100和120之间)至少会有一些可用性。从OP所说的(在线商店),这听起来像是通过其他主要谓词(最近的产品、按类别的产品、按制造商的产品等)访问所讨论的表,因此是否需要股票水平指数还没有定论。