2009-11-16 59 views
1

當配置文件是演員時,此查詢會爲我提供證據記錄最多的配置文件。 有沒有辦法讓它在mysql查詢中更快?有沒有更快的方法來統計加入的記錄

SELECT profiles.*, count(*) AS counted_profiles 
FROM `profiles` 
INNER JOIN (SELECT ev.actor_id 
      FROM evidences AS ev 
      WHERE ev.actor_type = 'Profile') AS ev2 
ON ev2.actor_id = profiles.id 
GROUP BY ev2.actor_id 
ORDER BY counted_profiles DESC LIMIT 10 

回答

0

您可以使用GROUP BY,ORDER BY和LIMIT子句中的子查詢,然後INNER JOIN這一點。 這只是另一種方式來做到這一點,雖然沒有確定性能增益。

+0

這是迄今爲止最快的查詢速度比全連接快27倍,因爲它在子查詢中返回的記錄少得多。 – james2m

4

你可以刪除profiles.*,刪除子查詢,並添加索引連接字段。

此外,考慮一下:

SELECT ev.actor_id, count(*) AS counted_profiles 
FROM `profiles` INNER JOIN evidences AS ev 
     ON ev.actor_id = profiles.id AND ev.actor_type = 'Profile' 
GROUP BY ev.actor_id 
ORDER BY counted_profiles DESC LIMIT 10 
+0

是的。無需爲此查詢使用派生表。派生表可能由MySQL實現,非常昂貴。 – MarkR

+0

這工作,但由於證據的大小表並沒有太快。主要收益來自於對子選擇進行限制和分組。 – james2m

相關問題