每次维护单独的计数表与运行计数查询是否更好?

fir*_*fly 7 sql database performance

我正在构建一个社交应用程序,它具有类似于twitter的跟随/跟随概念.

从性能的角度来看,找不到关注者和关注用户,是否最好为计数维护一个单独的表?或者每次只进行一次计数查询?

更新:

同样,我有一种调查类型的功能,人们可以投票,人们只能投票是或否.现在我将投票存储在一个单独的表中.我需要显示没有参与者的调查列表,没有我的主页上的是和否.

类似于stackoverflow主页(其中显示了投票,答案和视图的数量).

Jan*_*net 7

大多数情况下,这取决于访问模式,即系统的使用方式.如果更新将是您的主要瓶颈,那么您不应该通过维护计数器来增加额外的开销.另一方面,如果访问具有计数准备的数据将为您节省大量时间,或者每次计数都是不可行的,那么您应该预先计算它.

作为一般准则,不要在实际测量性能成为问题之前添加表,例如您建议的单独计数表,这些表纯粹用于性能优化.具有单独的计数表会破坏规范化(因为任何类型的缓存都会执行,因为数据现在在两个位置复制)并且会使代码更复杂,因此不应该仅仅因为可能需要计数.

(总而言之,一些数据库支持物化视图/物化查询,允许您在后台透明地轻松进行这种缓存.这些物化表由数据库更新,因此程序代码不必担心它,也,取决于查询优化器的复杂程度,可用于透明地优化查询.)

更新: 否/是投票问题有点不同,因为主要目的是跟踪计数,不一定是整个信息(即投票赞成的人).因此,有效的实施可能只是跟踪是和否投票的累计数量.但是,你存储的信息越多(即谁投票赞成,而不仅仅是很多),如果你选择这样做,你可以用它做的越多(例如,在Stackoverflow中我总是可以删除我的upvote - 如果你不能做的话你没跟踪谁投票).在这种情况下,我会建议反对早期汇总,因为您将丢失某些信息.