SELECT contents.*,
(SELECT COUNT(*)
FROM comments
WHERE comments.scrap_id = contents.org_scrap_id) AS comment_count
FROM contents
ORDER BY comment_count
这是我的意图。但它等待很长时间。
如何提高此查询的效果?
答案 0 :(得分:1)
您可以使用join重写查询,但是为了提高性能需要解释计划,您使用的是相关子查询,该子查询将针对内容表中的每一行运行,并且可能会降低查询的性能,对于以下查询,您需要一个索引来自评论表的scrap_id
和来自内容表的org_scrap_id
(如果它不是主键
SELECT c.*, COUNT(cm.scrap_id) comment_count
LEFT JOIN comments cm
ON cm.scrap_id = c.org_scrap_id
FROM contents c
GROUP BY c.org_scrap_id
ORDER BY comment_count
答案 1 :(得分:0)
您可以通过在comments(scrap_id)
上创建索引来提高效果:
create index comments_scrap_id on comments(scrap_id);
您还可以尝试将其作为join
和group by
:
SELECT co.*, count(com.scrap_id) as comment_count
FROM contents co left outer join
comments com
on co.org_scrap_id = com.scrap_id
GROUP BY co.id
---------^ or whatever the appropriate `id` is for this table
ORDER BY comment_count;
但该指数可能会带来更好的表现。
答案 2 :(得分:0)
我建议你使用与你现在正在做的相比更快的连接
SELECT contents.*, count(comments.scrap_id)
from contents
left outer join comments on comments.scrap_id=contents.scrap_id
group by comments.scrap_id
感谢。
答案 3 :(得分:0)
请尝试这样做并检查它是否会对性能产生任何影响。
SELECT Conts.* ,
Comts.scrap_id_COUNT
FROM
contents Conts INNER JOIN( SELECT scrap_id ,
COUNT(1) AS scrap_id_COUNT
FROM comments
GROUP BY scrap_id
) AS Comts
ON Conts.org_scrap_id = Comts.scrap_id
ORDER BY Comts.scrap_id_COUNT