来自数据库与增量的COUNT

时间:2015-08-18 19:50:59

标签: mysql sql

哪种方法更适合用于获取喜欢的数量?

假设我有桌子喜欢:

enter image description here

所以like_type是确定id_liked的类型。因此,如果like_type为“question”且id_liked为10,那么like就属于这一行:

SELECT * FROM questions where question_id = 10;

如果like_type为“answer”,则带答案的行将为

SELECT * FROM answers where answer_id = 10;

enter image description here

所以主要的问题是:哪种方法最适合用id 10喜欢的所有问题?

SELECT COUNT() as like_numbers from likes where like_type = `question` AND id_liked = 10;

OR

每当有人喜欢问题时,问题表中的问题都会增加,所以没有必要每次都计算。

3 个答案:

答案 0 :(得分:2)

这取决于几个因素。以下是一些优点和缺点,您可以自己决定。

增加数字

赞成

  • 查找单个数字更容易,更高效。
  • 易于修改以扭曲结果。

缺点

  • 人们可能会找到一种喜欢多次的方式。
  • 如果需要重新计算个人喜欢,则无法统计。
  • 无法移除喜欢删除/禁止用户等内容的内容。

存储个人喜欢

赞成

  • 如果由于某种原因数字出现偏差,可以重新计算。
  • 更详细,你可以自己计算喜欢的人。
  • 可以存储识别信息,以防止多个喜欢同一个问题或答案。
  • 如果用户被删除/禁止(或者只是不计算这些用户的投票数),可以删除投票。

缺点

  • 计算多行的效率较低,特别是如果数字真的非常高,那么(想想[m | b | tr] illions +)。
  • 使用更多空间。可能不是问题,但是当你有很多行时,它可能会。虽然需要很多。

我的网站使用的论坛软件我相信两者都有。每个帖子都有一个竖起大拇指按钮,它存储每行的计数,但也记录每个单独的投票。作为管理员,我可以将计数编辑为另一个仅调整计数的数字,但我可以将该数字悬停在帖子上,看看谁投票了。管理面板中还有一个“重新计算所有帖子分数”选项,该选项将重新调整,并将数字重新调整为实际投票数。

答案 1 :(得分:1)

这实际上取决于您的特定需求,预期的并发性和应用程序的复杂性。

如果您已经在阅读该表格以生成问题列表,那么使用questions表格上的当前计数对列进行缓存可能会更有效。

表不会从缓存计数中删除它们。即使您有这样的条件,也必须确定性能优势是否值得在您的方案中添加其他逻辑。

另一种选择是通过cronjob或其他机制在计划上生成缓存计数。这可以最大限度地减少您对应用程序逻辑和MySQL查询缓存的影响,但也会增加一些复杂程度,在您的情况下似乎影响很小(添加类似内容时添加计数的成本很低)。 / p>

如果您向likes列添加索引,它会提高从该表计算喜欢的效果 - 但您仍然会有id_liked或每个单独查询的开销将此问题与您的问题联系起来。

注意:如果您要添加某种类型的count列,请确保在MySQL中以原子方式执行此操作,这样您就不会消除在查询当前计数和更新值之间发生的喜欢:

JOIN

答案 2 :(得分:0)

我相信你最好的选择是使用这个查询:

var starvalue = $('.rating', $(this)).text();

但是在id_liked上添加一个索引,like_type。

使用第二个选项,您可能会在对问题和答案非常喜欢的情况下获得稍快的查询响应,但是当您的计数以某种方式不同步时,您还需要开发更多工作以及潜在的维护问题。