MySQL:在列列表中使用GROUP BY vs subselect

时间:2013-01-04 20:50:38

标签: mysql subquery

在我的应用程序中,我有两个关于一对多的MySQL表,'单位'和'印象'。我需要从单位表中获取所有广告单元的列表,但也需要获取每个广告单元的展示次数。

我有两个SELECT查询来执行此任务(本例简化),首先使用子选择:

SELECT 
    (SELECT COUNT(*) FROM impressions WHERE impression_unit_id = unit_id) AS impressions_count,
    unit_id
FROM units;

和第二个使用GROUP BY:

SELECT
    COUNT(impression_id) AS impressions_count,
    unit_id
FROM units
LEFT JOIN impressions ON impression_unit_id = unit_id
GROUP BY unit_id;

每个记录(广告单元)的子选择查询运行,因此GROUP BY看起来更聪明,但它有一个JOIN更多。哪一个更喜欢表现?

1 个答案:

答案 0 :(得分:2)

GROUP BY查询效果会更好。查询优化器可能会优化第一个查询以使用连接,但我不会指望它,因为它被编写为使用依赖子查询,这将慢得多。只要表格被正确编入索引,JOIN s就不应成为表现的主要关注点。

第一个查询,如果未优化使用JOIN,则必须为单元表中的每一行运行子查询,其中JOIN查询完成所有操作一次手术。

要了解查询的优化方式,请运行两个查询的EXPLAIN。如果第一个使用从属子查询,它将会更慢。