SQL COUNT(col)vs额外的日志记录列...效率?

时间:2011-08-30 02:14:41

标签: sql performance count

我似乎无法找到关于此的更多信息。

我有一个表来记录用户评论。我有另一个表来记录每个评论的其他用户的喜欢/不喜欢。 因此,当选择要在网页上显示的数据时,存在需要连接和子查询来计算所有喜欢/不喜欢的复杂查询。 我的例子是有人在这里帮助我实现所需结果的查询:

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更有效率,或者在定期查询时有额外的列计数?

1 个答案:

答案 0 :(得分:0)

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

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

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;