4

在我的应用程序中,我有两个 MySQL 表,'units' 和 'impressions' 是一对多的关系。我需要从单位表中获取所有广告单元的列表,还需要获取每个广告单元的展示次数。

我有两个 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。性能更喜欢哪一个?

4

1 回答 1

3

查询将GROUP BY执行得更好。查询优化器可能会优化第一个查询以使用连接,但我不会指望它,因为它是为使用依赖子查询而编写的,这会慢得多。只要表被正确索引,JOINs 不应该是性能的主要问题。

第一个查询,如果它没有得到优化以使用 a ,JOIN则必须为单元表中的每一行运行子查询,其中JOIN查询在一个操作中完成所有操作。

要了解查询是如何优化的,请运行EXPLAIN两个查询中的一个。如果第一个使用依赖子查询,它会更慢。

于 2013-01-04T20:56:34.907 回答