gpt4 book ai didi

MySQL- 计数行 VS 设置计数器

转载 作者:行者123 更新时间:2023-11-29 01:28:56 25 4
gpt4 key购买 nike

我有 2 个表 posts <id, user_id, text, votes_counter, created> votes <id, post_id, user_id, vote> .这里的表格投票可以是 1(赞成票)或 -1(反对票)。现在,如果我需要获取帖子的总票数(赞成票 - 反对票),我可以通过两种方式完成。

  1. 使用 count(*) votes 计算该帖子的赞成票和反对票数量表格,然后做数学运算。
  2. 设置计数器列 votes_counter并在每次用户赞成票或反对票时增加或减少它。然后简单地提取 votes_counter .

我的问题是哪个更好,在什么条件下。我所说的条件是指可扩展性、高峰时间等因素。

据我所知,如果我使用方法 1,对于具有数百万行的表, count(*) 可能是一项繁重的操作。为避免这种情况,如果我在高峰时段使用计数器,则 votes_counter 列可能会死锁,因为有太多用户试图更新计数器!

是否有第三种方法比这两种方法都好并且实现起来同样简单?

最佳答案

这两种方法代表了实现复杂性和速度之间的共同权衡。

  • 第一种方法实现起来非常简单,因为它不需要您进行任何额外的编码。
  • 第二种方法可能要快得多,尤其是当您需要对大表中的一小部分项目进行计数时
  • 第一种方法可以通过精心设计的索引来加速。您的 RDBMS 可以从索引中检索一些记录,并使用它们进行计数,而不是搜索整个表

第二种方法很快就会变得非常复杂:

  • 您需要考虑当用户被删除时计数会发生什么情况
  • 您应该考虑当投票表被您程序之外的工具操纵时会发生什么。例如,当当前计数与单独的计数一起存储时,合并来自两个数据库的记录可能会复杂得多。

我将从第一种方法开始,看看它的表现如何。然后我会尝试用索引优化它。最后,我会考虑采用第二种方法,可能会编写触发器来自动更新计数。

关于MySQL- 计数行 VS 设置计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24421380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com