根据字段的值聚合数据

时间:2017-04-11 21:51:23

标签: mysql database aggregation mysql-5.6

我需要优化一个旧的遗留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 ', ')的部分)

1 个答案:

答案 0 :(得分:0)

GROUP_CONCAT简单地连接组内的所有字段值 - 除了空值,它们被删除。非常像SUM,或任何其他聚合函数:MAX,MIN,等等。

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

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

实际上,对于特别是THAT查询的重大优化没有实际的方法。

我认为更改它或数据库架构会破坏另一方面的应用程序。对? 好吧,不是真的&#34;打破&#34;,但需要你想要避免的逻辑更改。