我正在用 php 创建一个论坛(为了好玩),我也想显示每个论坛的帖子和主题的数量。是否最好在数据库中的我的论坛中添加一列以显示主题/主题的数量,并且每当有人创建/删除主题时,它都会得到更新,或者每次加载论坛页面时计算主题/主题的数量?在这种情况下,常见的做法是什么?
4 回答
计数记录是做到这一点的唯一可靠方法;如果您存储计数,那么您将需要解决并发问题;给数据库一个机会,只有当它成为一个真正的问题时才修复它。我的经验是 COUNT(*) 可以非常快。
我有一个包含 120 万条记录的表(并且它具有正确的索引);刚刚尝试select count(*) from table_name where field=11;
需要 0.02 秒并返回 104,计算 500k 条记录需要 0.15 秒。这是在相当低规格的 VPS 上使用 mysql。
关键是进行一些性能测试,并且仅在出现真正的性能问题时才优化最简单最可靠的解决方案。
数据库规范化规则说,您的数据库中不应该有任何可以基于数据库中的其他值以编程方式构造的值。因此,如果您只关注“适当的工程”,则应在每次需要显示主题时计算主题。
在正常情况下,保持一个计数器值不会提高太多性能。应该可以编写查询,以便在需要显示这些值时重新计算这些值的性能影响可以忽略不计,如果有的话。正如其他帖子中所指出的COUNT
,即使指定了条件,也可以非常快。请记住在必要时使用索引。
最后,你必须做出决定。根据所需的使用情况,使您的数据库标准化可能会阻碍性能足以保证付出代价,使您的应用程序的性能稍微降低一点,并在某处添加一个计数器。但是,非规范化数据库应该始终是最后的手段。
我不认为这两个步骤是可选的。
If you dont update the count whenever someone creates/deletes a thread,
which count will you display on your forum?
每当有任何更新,即创建/删除时,您必须增加/减少计数器。然后在显示时您始终可以显示计数。
我建议在添加或删除新帖子时更新计数。此更新应该是准确的,因此需要进行一些锁定。锁定会在父记录上产生一些争用(更新论坛的线程、更新线程的帖子等)。确保您定义了索引,以便快速更新。
用户浏览论坛时,根本不锁定记录。我不会关心脏读,因为 100% 准确并不像会计软件那样重要。论坛是一个活生生的实体,所以如果在页面加载之间看起来略有不同也没关系。
此外,您可能希望偶尔运行一些查询以验证计数是否正确。