【问题标题】:COUNT(*) vs manual tracking of counters?COUNT(*) 与手动跟踪计数器?
【发布时间】:2025-12-15 23:20:29
【问题描述】:

我有一张桌子,大约有一张桌子。 70000 个条目。它包含有关品牌、型号和商品类别的信息。用户可以使用它们的任意组合来查询它们,并且必须根据他的选择更新显示的符合条件的商品计数器。

我使用类似

的查询完成了它
SELECT model,COUNT(*) AS count FROM table$model_where 
          GROUP BY model
          ORDER BY count DESC

$model_where 的位置取决于其他条件。但是我的老板让我重新做这些查询以使用一个特殊的计数器表,因为他认为它们会减慢整个过程,但我提出的基准表明并非如此,示例输出:

The code took: 0 wallclock secs (0.02 usr + 0.00 sys = 0.02 CPU)

它从一开始就测量整个例程,直到数据发送给用户,您可以看到它非常快。

我已经对这个问题进行了一些研究,但我仍然没有看到关于何时使用 COUNT(*) 与柜台表的明确答案。谁是对的?我不认为我们真的需要手动跟踪这个,但也许我知道的很少。

【问题讨论】:

  • 将来您的桌子会扩大 10 倍吗? 1000 倍?这会影响您测量的时间吗?
  • 不太可能。它已经充满了生产数据。未来可能会增长,但不会太多。
  • 找到合适的呆伯特卡通片,在他不看的时候把它放在他的桌子上。

标签: mysql database database-performance


【解决方案1】:

根据您的具体情况,这可能是premature optimization 的情况,也可能不是。

如果下周您将拥有 100 倍大的桌子,那可能不是这样,否则就是这样。

此外,您的老板应该考虑到,您和其他所有人都必须确保每当计数记录上出现INSERTDELETE 时都会更新计数器。有一些框架可以自动执行此操作(想到了 ruby​​ on rails 的 ActiveRecord),但如果您不使用其中一个,那么您可能会在数据库中找到错误的计数器

【讨论】:

  • 提醒一下,我实施了手动跟踪计数器,因为基准测试显示微不足道一致的性能提升(如果有的话),我对此无可争辩。谁可以?