2009-11-16 63 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

相关问题