Mysql重复计数的表现

时间:2014-06-28 16:28:58

标签: sql count

我需要获取每篇博客文章,评论数量以及我目前使用此SQL

select 
id as article_id,
title,
content,
pic,
(select count(id) as comments from article_comments where
article_comments.article_parent_id = article_id group by article_id) as comments
from articles limit 1000);

与没有 count(id) 子查询的查询相比,此查询有一些显着的延迟。对于1000篇选定的文章,延迟约为2-4秒。有没有办法提高此查询的性能?

3 个答案:

答案 0 :(得分:0)

对大数据使用count会越来越多地产生延迟。为了提高获取文章中评论的数量,请在名为comment_count的文章表中创建一个属性。每当有人输入评论时,相应的文章记录中的数字将增加1。这样,当您想要检索文章时,每次加载页面时都不必计算注释,它只是一个属性。

答案 1 :(得分:0)

这是您的查询:

select id as article_id, title, content, pic,
       (select count(id) as comments
        from article_comments
        where article_comments.article_parent_id = articles.article_id
        group by article_id
       ) as comments
from articles
limit 1000;

首先,group by是不必要的。其次,索引article_comments(article_parent_id)应该有所帮助。最终查询可能如下所示:

select a.id as article_id, a.title, a.content, a.pic,
       (select count(*) as comments
        from article_comments ac
        where ac.article_parent_id = a.article_id
       ) as comments
from articles a
limit 1000;

请注意,这也会引入表别名。这些使查询更容易编写和阅读。

答案 2 :(得分:0)

我发现如果情况允许的话,第一次sql查询然后从中提取所需的id并使用in()运算符进行第二次sql查询而不是连接表/嵌套查询要快得多。

select id as article_id, title, content, pic from articles limit 1000

此时我们需要声明一个字符串变量,该变量将包含将在下一个查询中进入()运算符的一组id。

<?php $in = '1, 2, 3, 4,...,1000'; ?>

现在我们为一组先前提取的文章ID选择评论计数。

select count(*) from article_comments where article_id in ($in)

这个方法在php代码方面略显混乱,因为在他看来我们需要包含文章数据的 $ articles 数组和 $ comments [&#39; article_id&#39;] < / em>包含每篇文章的评论数量的数组。

与性能改进相反,这种方法对于PHP代码来说更加混乱,并且无法在第二个或任何下一个表中搜索值。 因此,只有在性能是关键且不需要其他操作的情况下,此方法才适用。