我在查询中添加了group_concat
并终止了性能。在我添加之前和之后解释计划是相同的,所以我对如何优化它感到困惑。
以下是查询的简化版本:
SELECT @curRow := @curRow + 1 AS row_number,
docID,
docTypeID,
CASE WHEN COUNT(1) > 1
THEN group_concat( makeID )
-- THEN 'multiple makes found'
ELSE MIN(makeID)
END AS makeID,
MIN(desc) AS desc
FROM simplified_mysql_table,
(SELECT @curRow := 0) r
GROUP BY docID, docTypeID,
CASE WHEN docTypeID = 1
THEN 0
ELSE row_number
END;
请注意CASE
中的SELECT
语句。 group_concat
杀死了表现。如果我评论该行并输出'multiple makes found',它会很快执行。知道是什么导致了这个吗?
答案 0 :(得分:10)
我们发现了潜在的问题。在此查询的原始非简化版本中,我们有一个DISTINCT,这是完全没必要的,并导致group_concat的性能问题。我不确定它为什么会导致这样的问题,但删除它会解决性能问题。谢谢大家的帮助。
答案 1 :(得分:3)
在MySQL中,group_concat
性能不应该 kill 查询性能。这是涉及字符串的额外工作,因此预计会有一些减速。但更像是10%而不是10倍。你能量化查询时间的差异吗?
问题:MakeID是字符串还是整数?我想知道从整数到字符串的转换是否会影响性能。
其次,concat(min(MakeId), '-', max(MakedId))
的效果是什么,而不是group_concat
?
第三,真正的group_concat
使用DISTINCT
还是ORDER BY
?这些可能会减慢速度,特别是在内存有限的环境中。
答案 2 :(得分:0)
一个想法是将查询分为两部分,一部分用于WHEN docTypeID = 1
,另一部分用于其余部分。
首先尝试在(docTypeID, docID, makeID, desc)
添加索引:
SELECT
docID,
docTypeID,
CAST(makeID AS CHAR) AS makeID,
`desc`
FROM
simplified_mysql_table,
WHERE
NOT docTypeID = 1
UNION ALL
SELECT
docID,
1,
GROUP_CONCAT( makeID ),
`desc` -- this is not standard SQL
FROM
simplified_mysql_table,
WHERE
docTypeID = 1
GROUP BY
docTypeID,
docID ;