2011-09-26 96 views
0

我有这个查询我设计的应用程序。有一个引用表,一个作者表和一个reference_authors表。有一个子查询返回给定参考的所有作者,然后显示格式在PHP中。子查询和查询单独运行都很好,并且很快。然而,只要子查询被放入主查询中,整个事情就会花费超过120秒的时间才能运行。我会在这一个上看到一些新鲜的眼睛。 谢谢。帮我优化这个查询

SELECT 
rf.reference_id, 
rf.reference_type_id, 
rf.article_title, 
rf.publication, 
rf.annotation, 
rf.publication_year, 
(SELECT GROUP_CONCAT(a.author_name) 
FROM authors_final AS a 
INNER JOIN reference_authors AS ra2 ON ra2.author_id = a.author_id 
WHERE ra2.reference_id = rf.reference_id 
GROUP BY ra2.reference_id) AS authors 
FROM 
references_final AS rf 
INNER JOIN reference_authors AS ra ON rf.reference_id = ra.reference_id 
LEFT JOIN reference_institutes AS ri ON rf.reference_id = ri.reference_id; 

这里是固定查询。感谢球员的建议。

SELECT 
rf.reference_id, 
rf.reference_type_id, 
rf.article_title, 
rf.publication, 
rf.annotation, 
rf.publication_year, 
GROUP_CONCAT(a.author_name) AS authors 
FROM 
references_final as rf 
INNER JOIN (reference_authors AS ra INNER JOIN authors_final AS a ON ra.author_id = a.author_id) 
ON rf.reference_id = ra.reference_id 
LEFT JOIN reference_institutes AS ri ON rf.reference_id = ri.reference_id 
GROUP BY rf.reference_id 
+0

您是否尝试将子查询重写为内连接? –

+0

我知道我错过了一些东西,我知道。只要看看你推荐的catcall,并将子查询重写为内连接,查询现在需要0.078秒。感谢百万队友。 – jiraiya

回答

0

虽然不是每个子查询都可以重写为内连接,但我认为你可以。

从120秒到78毫秒不是一个坏的改善 - 大约三个数量级。休息一天休息。

当你明天回来时,开始在源代码中寻找其他子查询。

0

你说这个子查询很好,很孤立,但它现在明显地运行了每一行--100行= 100个子查询。

假设您的所有外键的索引与它作为子查询一样好。

一种选择是留下连接作者并创建一个笛卡尔积 - 你将有更多的行返回,并且需要一些代码才能达到相同的最终结果,但是它会减少对数据库的压力并且会运行更快。

如果你已经有了分页功能并且说要返回10行,那么发起10次单独调用来隔离作者也会很快。