我需要获取每篇博客文章,评论数量以及我目前使用此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秒。有没有办法提高此查询的性能?
答案 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代码来说更加混乱,并且无法在第二个或任何下一个表中搜索值。 因此,只有在性能是关键且不需要其他操作的情况下,此方法才适用。