哪个最快?计数子查询或分组依据
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 子查询分组、求和和计数