根据字段值聚合数据

Posted

技术标签:

【中文标题】根据字段值聚合数据【英文标题】:Aggregation of data depending on the value of the field 【发布时间】:2017-09-07 11:34:53 【问题描述】:

我需要优化一个旧的旧 sql 查询,该查询由于在查询执行期间数据库服务器上的可用磁盘空间不足而开始失败(它使用 20 Gigs 的临时表并退出并出现错误)。

查询有点复杂,因为它根据查询表中某个字段的值将数据聚合到不同的别名中。主要思想是使用选项组查询表,并为结果表的列生成别名。

架构和查询示例在这里:http://sqlfiddle.com/#!9/64e86/2/0。在实际查询中,IN 子句中有 10-12 个 opt_types。

问题是这两个表分别有 2.5kk 行和 18.5kk 行。

对于较小的数据量(70k 和 750k),此查询可以在很短的时间内完美运行。

知道如何改进此查询以使其在大量数据上运行吗? 数据库是 mysql 5.6。使用本机 mysql < query_file.sql 命令通过 bash 脚本将查询填充到服务器。

PS 坦率地说,我不太了解这个查询是如何工作的(确切地说,是使用 GROUP_CONCAT(DISTINCT IF(...) ORDER BY ... ASC SEPARATOR ', ') 的部分)

【问题讨论】:

什么是2.5kk?百万? 也将所有内容都放在问题中。链接中断。尤其是 SQLFiddle。 【参考方案1】:

GROUP_CONCAT 只是连接组内的所有字段值 - 除了空值,它们被删除。与 SUM 或任何其他聚合函数非常相似:MAX、MIN 等等。

在这种情况下,它会生成组内发生的具有特定类型的所有不同(彼此)值的排序列表,用逗号分隔。

现在你的问题...增加磁盘空间,就是这样! 便宜又简单。

确实,没有任何实际方法可以显着优化特别是那个查询。

我认为更改它或数据库架构会破坏另一端的应用程序。正确的? 好的,不是真正的“中断”,而是需要您想要避免的逻辑更改。

【讨论】:

以上是关于根据字段值聚合数据的主要内容,如果未能解决你的问题,请参考以下文章

Elasticsearch 聚合功能

Django:如何根据来自行的数据和来自另一个模型的数据将聚合字段添加到查询集中?

SQLite 自定义函数,聚合,排序规则

在 Pandas 中取消聚合字符串值字段 [重复]

MySQL数据库:聚合函数的使用

根据另一列值重新采样和聚合数据