哪个最快?计数子查询或分组依据

Posted

技术标签:

【中文标题】哪个最快?计数子查询或分组依据【英文标题】:Which is fastest? Count in subquery or with group by 【发布时间】:2014-03-03 22:47:06 【问题描述】:

哪个最快/最有效?两者都有效。

解决方案 1. 按 id 分组:

SELECT
    *, 
    COUNT(*) AS pages 
FROM
    notis 
WHERE
    cid = 20 
GROUP BY
    n.id
ORDER BY
    nid DESC 

解决方案 2. 在子查询中计数:

SELECT
    *,
    (select count(*) FROM notis WHERE cid=20) AS count
FROM
    notis
WHERE
    cid = 20
ORDER BY
    nid DESC

【问题讨论】:

Downvoter:您不喜欢我好奇的问题的原因将不胜感激。提前致谢! 这些看起来不会产生等效的输出。 第一个是无效的(标准)SQL,mysql 不会拒绝它,而是返回随机数据。 【参考方案1】:

解决方案 1 是最佳且快速的: 因为解决方案 2 有子查询

但是您必须像这样更改您的查询:

  SELECT *, COUNT(*) AS pages 
  FROM notis 
  WHERE cid = 20 
  GROUP BY nid
  ORDER BY nid DESC 

您更改了 GROUP BY 和 ORDER BY 的位置。

我不知道您是在寻找 count(*) 还是想要按每个 nid 计数。如果 count(*) 则考虑不使用 GROUP BY

 SELECT *, COUNT(*) AS pages 
 FROM notis 
 WHERE cid = 20 
 ORDER BY nid DESC 

【讨论】:

group by 使用无效(标准)SQL,MySQL 不会拒绝它,而是更喜欢随机结果:mysqlperformanceblog.com/2006/09/06/… @a_horse_with_no_name 。 . .更准确地说,通过扩展使用分组会导致匹配行中的 任意 值。实际上,随机性是一个很难获得的属性。 (文档使用“不确定”一词,dev.mysql.com/doc/refman/5.7/en/group-by-extensions.html.)

以上是关于哪个最快?计数子查询或分组依据的主要内容,如果未能解决你的问题,请参考以下文章

使用子查询和分组依据每天计算每个国家/地区的 DAU 平均值

SQL Server 2008 R2 子查询分组、求和和计数

SQL语句汇总(三)——聚合函数分组子查询及组合查询 - Darly

没有聚合或子查询的查询

数据库查询选择所有列,包括按“分组依据”的每条记录的计数

内连接+计数+分组依据