【问题标题】:SQL COUNT(col) vs extra logging column... efficiency?SQL COUNT(col) 与额外的日志记录列...效率?
【发布时间】:2011-11-06 11:18:35
【问题描述】:

我似乎找不到太多关于此的信息。

我有一个记录用户 cmets 的表。我有另一个表来记录其他用户对每条评论的喜欢/不喜欢。 Therefore, when selecting this data to be displayed on a web page, there is a complex query requiring joins and subqueries to count all likes / dislikes. 我的示例是有人在此处帮助我实现所需结果的查询:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes,
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes,
  comment_likers.liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers  ON ( comments.comment_id = comment_likers.comment_id 
  AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;

但是,如果我在 COMMENTS 表中添加了一个喜欢和不喜欢的列,并创建了一个触发器来在喜欢插入/删除/更新到 LIKER 表时自动递增/递减这些列,那么 SELECT 语句会更简单而且更多比现在高效。我在问,使用 COUNTS 进行这个复杂的查询还是使用额外的列和触发器更有效?

概括地说,在定期查询时使用 COUNT 还是增加一列用于计数更有效?

【问题讨论】:

标签: sql performance count


【解决方案1】:

您的查询效率很低。您可以轻松消除这些子查询,从而显着提高性能:

您的两个子查询可以简单地替换为:

sum(liker) likes,
sum(abs(liker - 1)) dislikes,

使整个查询如下:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    sum(liker) likes,
    sum(abs(liker - 1)) dislikes,
    comment_likers.liker
FROM comments
INNER JOIN usrs ON comments.usr_id = usrs.usr_id
LEFT JOIN comment_likers  ON comments.comment_id = comment_likers.comment_id 
  AND comment_likers.usr_id = $usrID
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;

【讨论】:

  • 感谢您的建议。我也不热衷于所有子查询,但看不到其他方法可以在一个查询中检索所有必需的数据。不幸的是,您的建议不起作用,但您可能没有意识到我的要求。实际上,我从这里得到了这个查询的帮助,链接在这里,它将向您展示我的要求:stackoverflow.com/questions/7225303/…
猜你喜欢
  • 2010-10-09
  • 1970-01-01
  • 2013-11-24
  • 2022-12-15
  • 2014-05-25
  • 1970-01-01
  • 2016-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多