Java 按整数或布尔值筛选的数据库性能?
我将有一个数据库表,其中有几百万个条目,例如网上商店的产品。 如果其中一个缺货,我希望以某种方式标记它,并将其从任何Java 按整数或布尔值筛选的数据库性能?,java,sql,dao,Java,Sql,Dao,我将有一个数据库表,其中有几百万个条目,例如网上商店的产品。 如果其中一个缺货,我希望以某种方式标记它,并将其从任何findAll()sql获取中排除 因此,我考虑了以下选项之一: 每个产品的可用性都有一个整数计数。无论如何,我必须把它设为0从availcount>0的产品中选择* 或者我可以引入一个boolean available='true'字段,如果缺货,我会将该字段设置为false,然后查询将是…如果可用='true' 问:这会有什么不同吗?是否有理由优先选择这些选项之一?我会坚持
findAll()
sql获取中排除
因此,我考虑了以下选项之一:
- 每个产品的可用性都有一个整数计数。无论如何,我必须把它设为0<代码>从availcount>0的产品中选择*
- 或者我可以引入一个
字段,如果缺货,我会将该字段设置为false,然后查询将是boolean available='true'
…如果可用='true'
问:这会有什么不同吗?是否有理由优先选择这些选项之一?我会坚持股票水平(
int availcount
)。位字段通常非常重要,除非数据中存在大量的倾斜,导致缺货的产品约为1%或更少(而且由于您可能只搜索库存产品,因此标记上的任何索引都将不使用)
由于您似乎已经在任何情况下存储了实际库存水平,因此在库存指示器中不存储available
将省去您保持两列同步的麻烦
最后,许多RDBMS允许您添加计算列(如果没有,则将available
指示符添加到视图),这将允许您从实际available
指示符逻辑推导available
指示符,而无需任何存储开销
编辑
- 根据下面的评论,请注意,
(对于availcount=0和availcount
的查询)上的索引将与位字段上的索引相同,尽管如果产品通常按其他条件搜索,则可能不需要索引availcount>0
- 除了在数据库中导出可用的
之外,还可以在代码中进行此确定,例如,实体类上的附加?
方法bool isAvailable(){return availcount>0;}
availcount>0
就可以了。
如果您不需要其他原因的计数,而只是试图在计数或布尔值之间进行选择,那么考虑更新该列而不是过滤会有多困难。
如果您只有一个布尔值,那么您只需要在产品缺货(或重新进货)时进行触摸。计数更为复杂:您需要在每次销售或重新进货时更新计数。这更为复杂,可能会影响性能,并且需要关注一堆或一个角落的案例。因此,除非您出于其他目的需要计数,否则最好还是使用布尔值。我认为这两个选项在
SELECT
上同样有效,只要相关列中有索引
索引
availcount
会对本专栏的任何更新产生一点影响(我猜本专栏会经常更新)。另一方面,拥有可用的列将为您的数据库增加冗余(即,它不会被规范化),这是您可能希望避免的。您正在使用的数据库。虽然布尔字段上的索引通常不是非常有效,但其(in)效率与int
列索引相同,用于支持查询,如其中count>0
确实是。如果决定索引availcount
,则在狭窄的availcount
范围内(例如,availcount在100和120之间)至少会有一些可用性。从OP所说的(在线商店),这听起来像是通过其他主要谓词(最近的产品、按类别的产品、按制造商的产品等)访问所讨论的表,因此是否需要股票水平指数还没有定论。