我的页面似乎很慢,我有一个页面至少有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会缓存主键字段的计数,并且不会导致任何问题。
答案 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)
选择计数可能会锁定所有表格。您可以在另一张桌子上使用计数器。但最好的解决方案是使用自动增量字段类型。