2017-04-11 27 views
0

我需要优化一个旧的传统sql查询,该查询由于在查询执行期间数据库服务器上缺少可用磁盘空间而开始失败(它使用20 Gig用于临时表并退出错误)。取决于字段值的数据聚合

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

模式样本和查询在这里:http://sqlfiddle.com/#!9/64e86/2/0。在真正的查询中,IN子句中有10-12个opt_types。

问题是,它就像两个表中的2.5kk行和18.5kk行。

对于较小的数据量(70k和750k),此查询运行良好并且时间很短。

任何想法如何改善这个查询,使其运行在大量的数据? 数据库是MySQL 5.6。查询通过bash脚本使用本机mysql < query_file.sql命令填充到服务器。

PS安静坦率地说,我不是很喜欢了解此查询是如何工作的(准确的说,使用该部分GROUP_CONCAT(DISTINCT IF(...) ORDER BY ... ASC SEPARATOR ', ')

+1

什么是'2.5kk'?百万? –

+0

也把所有的问题也放在这个问题上。链接中断。特别是SQLFiddle。 –

回答

0

GROUP_CONCAT简单地串接所有的字段值withinin组 - 除了零点,他们”重新下降。几乎和SUM一样,或者其他任何聚合函数:MAX,MIN,等等。

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

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

真的,没有实际的方法来显着优化特别是THAT查询。

而且我认为改变它或数据库模式会在另一端破坏应用程序。对? 好的,不是真的“休息”,而是需要逻辑改变,你想避免。