【问题标题】:Database performance for filter by integer or boolean?按整数或布尔值过滤的数据库性能?
【发布时间】:2014-12-08 16:54:22
【问题描述】:

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

因此我选择了以下选项之一:

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

问题:这会有什么不同吗?有什么理由应该首选这些选项之一?

【问题讨论】:

  • 您正在使用哪个数据库。

标签: java sql dao


【解决方案1】:

我会坚持库存水平 (int availcount)。位字段通常非常 difficult to index,除非数据中存在大量偏差,导致 1% 或更少的产品缺货(并且由于您可能只搜索有货产品,因此任何标志上的索引将不会被使用)。

因为无论如何您似乎已经存储了实际库存水平,所以不在库存指标中存储available 将使您在尝试保持两列同步时免去麻烦。

最后,许多 RDBMS 允许您添加 COMPUTED 列(或失败,将 available 指标添加到 VIEW),这将允许您从实际 availcount 逻辑推导 available 指标,而无需任何存储开销。

编辑

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

【讨论】:

  • 虽然布尔字段上的索引通常不是很有效,但它的(无效)效率与 int 列索引的效率相同,用于支持像 @ 这样的查询987654334@
  • 是的,确实如此。如果决定对availcount 进行索引,那么在狭窄的availcount 范围(例如,在 100 到 120 之间)至少会有一些 SARGability。从 OP 所说的(在线商店)来看,听起来有问题的表将通过其他主要谓词(最近的产品、按类别的产品、按制造商的产品等)访问,因此库存水平指数是否是没有实际意义的完全需要。
【解决方案2】:

如果您已经拥有availcount 列,则无需添加新列,您的availcount > 0 就可以了。 如果您出于其他原因不需要计数,并且只是试图在计数或布尔值之间做出决定,请考虑更新该列而不是过滤的难度。

如果您只有一个布尔值,您只需要在产品缺货(或重新进货)时触摸。计数更复杂:每次进行销售或重新进货时,您都需要更新计数。这更复杂,可能会影响性能,并且需要关心一堆或极端情况。因此,除非您需要将计数用于其他目的,否则坚持使用布尔值可能是一个更好的主意。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-26
      • 2017-06-25
      • 1970-01-01
      • 2020-05-15
      • 2021-05-28
      • 2017-04-26
      • 2023-04-07
      • 2016-08-09
      相关资源
      最近更新 更多