在我的应用程序中,我有两个关于一对多的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更多。哪一个更喜欢表现?
答案 0 :(得分:2)
GROUP BY
查询效果会更好。查询优化器可能会优化第一个查询以使用连接,但我不会指望它,因为它被编写为使用依赖子查询,这将慢得多。只要表格被正确编入索引,JOIN
s就不应成为表现的主要关注点。
第一个查询,如果未优化使用JOIN
,则必须为单元表中的每一行运行子查询,其中JOIN
查询完成所有操作一次手术。
要了解查询的优化方式,请运行两个查询的EXPLAIN
。如果第一个使用从属子查询,它将会更慢。