我应该使用(从table2中选择count(id))作为col1,还是应该在表1上存储计数器并在插入时增加它?

时间:2011-11-10 13:33:58

标签: mysql performance indexing count

我的页面似乎很慢,我有一个页面至少有20个“选择计数”查询,每行至少有两个字段进行计数子查询。我虽然不会那么慢,但现在我不确定。我想知道哪一个是这种情况的默认方法。 (如果我需要索引某些列,我也想确定哪一列,但是count函数会计算某些表中的id,所以我认为这也不是一个无法解决的问题。“

if(isset($_GET["me"])) $me="and post.memberid=".$_SESSION["memberid"]; else $me="";
$votecount="(select count(voteid) from vote where vote.postid=post.postid) as cv";
$commentcount="(select count(commentid) from comment where comment.postid=post.postid) as cc";
$countagree="(select count(voteid) from vote where vote=1 and vote.postid=post.postid) as ca";
$ismyvote=sprintf("(select vote from vote where memberid=%s and vote.postid=post.postid) as mvote",$_SESSION["memberid"]);
$plq=sprintf("select *, %s,%s,%s,%s from post where post.dateposted>=NOW() - INTERVAL %s day %s",$votecount,$commentcount,$countagree,$ismyvote,$since,$me);

当我开始开发它时,我认为mysql会缓存主键字段的计数,并且不会导致任何问题。

3 个答案:

答案 0 :(得分:1)

您正在对投票进行3次单独查询,对评论和发布进行2次其他查询,并使用子查询......这很糟糕。

也许你可以这样做:

select
  post.*, 
  count(vote.voteid), 
  count(comment.commentid) 
from 
  vote, post, comment
where
  vote.postid=post.postid and
  comment.postid=post.postid and
  vote=1 and vote.postid=post.postid and
  memberid=$_SESSION["memberid"] and vote.postid=post.postid and
  post.dateposted>=NOW() - INTERVAL %s day and post.memberid=".$_SESSION["memberid"]"

它可能不起作用,你需要修复一些东西,但这种方式将允许dbms为你做一些查询计划优化,它可能会更快。

答案 1 :(得分:1)

我会尝试Vik的查询以及danihp的计数器列方法。时间并根据您的实际数据和应用比较结果。

但我确实相信,对你最有帮助的真正答案是真正学习和使用解释计划(如果你还没有)

http://en.wikipedia.org/wiki/Explain_Plan

你提到“似乎很慢”和“我虽然它不会那么慢,现在我不确定。”并且“所以我认为这也不是一个索引问题。”

因此,除非您真正测量更改的结果,并且解释计划将有助于此以及索引等等,所以似乎进行更改将是非常反复试验。

祝你好运!

答案 2 :(得分:0)

选择计数可能会锁定所有表格。您可以在另一张桌子上使用计数器。但最好的解决方案是使用自动增量字段类型。