具有 30M 行的表中的 COUNT(*) 和 GROUP BY

Posted

技术标签:

【中文标题】具有 30M 行的表中的 COUNT(*) 和 GROUP BY【英文标题】:COUNT(*) with GROUP BY in a table with 30M rows 【发布时间】:2020-01-22 14:04:22 【问题描述】:

我必须从包含 3000 万行的表中提取数据。 表中的特征是visits_id(primary)survey_id company_id

我必须计算每家公司的每次调查的访问次数,因为我知道一家公司可以进行多项调查。

我的查询是:

SELECT v.survey_id, v.company_id, COUNT(*)
FROM visit AS v
GROUP BY v.survey_id, v.company_id

主要问题是它需要很长时间。无论如何优化查询? 还是 SQL 做不到或不值得付出努力?

【问题讨论】:

您使用的是哪个 dbms? 请标记您的数据库并准确告诉我们需要多长时间。如果您按月报告计数,则将表拆分为每月表并将计数存储到另一个表中以供以后用于报告可能是有意义的。 我们有一个 mysql 数据库。只需要 25 秒就可以在没有 GROUP BY 的情况下创建一个简单的 SELECT COUNT(*)。 【参考方案1】:

提高查询性能的最直接方法是在survey_id, company_id 上添加复合索引。

添加索引的主要缺点是 写入 更长。如果这是一个问题(或者改进此查询不值得),那么您可以在后台定期预处理数据并将计数存储在某处。显然,您可能会遇到过时的计数。

【讨论】:

以上是关于具有 30M 行的表中的 COUNT(*) 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 来自具有“父”和“子”行的表中的 Json

获取具有指定 id 的表中的行的值

即使使用 parallel(8) 提示,具有数百万条记录的表中的 Count(1) 也很慢

具有百万条记录的表中的Count即使有parallel提示也很慢

在具有重复行的 SQL Server 表中按组查找行号

SqlSever基础 count 查询两个相关关联的表中的具有相同内容的行数