【问题标题】:MySQL: Using GROUP BY vs subselect in columns listMySQL:在列列表中使用 GROUP BY vs subselect
【发布时间】:2013-01-04 20:50:37
【问题描述】:

在我的应用程序中,我有两个 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。在性能方面更喜欢哪一个?

【问题讨论】:

  • 两个都试一下,看看它们的表现如何……我希望数据库会为这两个查询提供相同的执行计划,所以我希望它们在性能方面...但是,出于美学原因,我会重新编写您的第二个查询以使用 left join 而不是 right join
  • Michael 你说得对,我已经编辑使用 LEFT JOIN 来指出“主”表。

标签: mysql subquery


【解决方案1】:

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

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

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

【讨论】:

  • EXPLAIN 第一个提到了依赖子查询,我想我应该坚持使用 GROUP BY,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2015-02-13
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2015-11-09
相关资源
最近更新 更多