如何提高SQL的性能?(使用子查询)

时间:2014-04-21 11:13:57

标签: mysql sql database-performance

SELECT contents.*, 

(SELECT COUNT(*)
FROM comments
WHERE comments.scrap_id = contents.org_scrap_id) AS comment_count

FROM contents
ORDER BY comment_count
这是我的意图。但它等待很长时间。

如何提高此查询的效果?

4 个答案:

答案 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);

您还可以尝试将其作为joingroup 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