当前位置: 首页 > 知识库问答 >
问题:

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

璩慎之
2023-03-14

在我的应用程序中,我有两个MySQL表,'units'和'impressions'。我需要从单位表中提取所有广告单位的列表,但也提取每个广告单位的印象计数。

我有两个SELECT查询来完成这个任务(本例简化了),首先使用Sub-SELECT:

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

第二次使用分组依据:

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

Sub-select查询为每个记录(ad单元)运行,因此GROUP BY看起来更聪明,但它多了一个JOIN。在性能上更喜欢哪一个?

共有1个答案

松成和
2023-03-14

group by查询将执行得更好。查询优化器可能会将第一个查询优化为使用联接,但我不会指望它,因为它被编写为使用依赖的子查询,这会慢得多。只要对表进行了适当的索引,joins就不应该是性能方面的主要问题。

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

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

 类似资料:
  • 问题内容: 我正在尝试编写一个查询,该查询将检查MySQL中的特定表是否具有特定列,如果没有,则创建它。否则什么都不做。在任何企业级数据库中,这实际上都是一个简单的过程,但是MySQL似乎是一个例外。 我以为 可以工作,但是失败很严重。有办法吗? 问题答案: 这对我来说很好。 使用PHP就像…

  • 问题内容: 我正在使用Hibernate和MySQL的项目中。我打算使用序列来为数据库中的所有表生成ID。(很难描述我的问题,因此我将向您举例说明)。 例如:我有2个表A和B。首先,我在表A中插入10条记录, 它们的ID为1到10 。然后,我在表B中插入10条记录,我希望 它们的ID为11-20 ,而不是1-10。这意味着生成的ID值将由数据库中所有表(而不是单个表)中的所有记录计算。 那么如何在

  • 我有四张桌子A、B、C和D。 我需要选择值2(我从表D中猜测),其中值1和值3在表D中的同一行中,并且在表A和表C的行中都有相同的“城市”。 所以,如果表A有一行 表C有行 表D有行 然后我需要打印:

  • 我试图在Haskell中编写一个函数,它可以做以下操作:输入一个整数列表,对于这些整数,使用map,有一个函数应用于它们,返回一个无限的整数列表。然后,我想使用union将foldr应用于列表,这样结果将是列表中这些列表的union。 现在的问题是,当我以10‘函数’[1,2]为例进行计算时,它会首先计算1的无限列表,因为它是一个无限列表,它永远不会对2进行计算。因此,它只返回输入列表中第一个元素

  • 问题内容: 目前,我有以下MySQL表: 我想将表更改为以下内容: 如何使用语句完成此操作? 注意:我只想更改列位置。 问题答案: 如果empName是VARCHAR(50)列: 编辑 根据评论,您还可以执行以下操作: 请注意,重复是故意的。您必须告诉MySQL您想保持相同的列名。 您应该注意,这两种语法版本都特定于MySQL。例如,它们在PostgreSQL或许多其他DBMS中不起作用。 另一编

  • 问题内容: 有没有办法在mysql中获取表的列名?使用PHP 问题答案: 您可以使用DESCRIBE: 或者,在较新的版本中,您可以使用INFORMATION_SCHEMA: 或者您可以使用SHOW COLUMNS: