【发布时间】: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。
标签: mysql database aggregation mysql-5.6