MySQL中的group_concat性能问题

时间:2012-11-29 17:37:15

标签: mysql sql

我在查询中添加了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',它会很快执行。知道是什么导致了这个吗?

3 个答案:

答案 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 ;