当前位置: 首页 > 面试题库 >

MySQL中的group_concat性能问题

南门新荣
2023-03-14
问题内容

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 make
found”,它将很快执行。知道是什么原因造成的吗?


问题答案:

在此查询的原始非简化版本中,我们有个DISTINCT,它是完全不必要的,并导致group_concat出现性能问题。我不知道为什么会引起这样的问题,但是删除它可以解决性能问题。



 类似资料:
  • 问题内容: SQL … 如您所见,它占用了文章的所有页面(每个页面均以长文本形式存储在单独的行中),并通过GROUP_CONCAT将它们分成单个长文本行。问题在于结果只有太多的字符,然后它被完全截断,丢失了大约90%的内容。CONCAT是否不能很好地处理长文本,还是我做错了其他事情? 问题答案: 根据MySQL手册,最大长度由系统变量定义,默认为1024。 可以使用以下命令来增加此值: 但是,应注

  • 我有3个表(SuccessOrder、FailedOrder和PendingOrder)具有相同的列。每个表都有超过200万条记录。我需要组合来自这3个表的所有数据,并按CreatedDate对它们进行排序,以显示在我的门户中。我正在使用UNION ALL组合所有表的结果。 如果我执行每个子查询,在1或2秒内得到结果。如果我执行整个查询(带有UNION ALL的3个子查询),则需要超过5分钟。 除

  • 问题内容: (注意:这个问题不是关于转义查询,而是关于转义结果) 我正在使用GROUP_CONCAT将多行合并为一个逗号分隔的列表。例如,假设我有两个(示例)表: 我想列出所有帖子以及对帖子发表评论的每个用户名的列表: 给我: 这很好用,但是如果用户名包含逗号会破坏用户列表。MySQL是否具有可以让我转义这些字符的功能?(请假定用户名可以包含任何字符,因为这只是示例架构) 问题答案: 如果用户名中

  • 问题内容: 我们正在考虑将UUID值用作MySQL数据库的主键。所插入的数据是从数十台,数百台甚至数千台远程计算机生成的,并且以每秒100-40,000次插入的速度插入,我们将永远不会进行任何更新。 在我们开始选择数据之前,数据库本身通常会获得大约5000万条记录,因此不是庞大的数据库,但也不小。我们也计划在InnoDB上运行,但是如果我们有更好的引擎来进行我们的工作,我们愿意改变它。 我们已经准

  • 问题内容: 我想知道是否在MySQL查询中使用CASE … WHEN … THEN表达式 对性能有负面影响? 而不是使用CASE表达式(例如,在UPDATE查询中), 您始终可以在程序中用 php,python,perl,java等编写if语句来选择要发送的查询(例如,以伪代码) ): 或侵入: (这里的c1只需要表明在两种情况下都发生了某些事情) 哪种方法具有更好的性能? 性能损失是多少? 问题

  • 问题内容: 我从这样的farmTOanimal表进行联接。有一个类似的farmTotool表 当我在视图中连接表时,得到的结果看起来像这样 现在,我执行GROUP BY FarmID,GROUP_CONCAT(动物)和GROUP_CONCAT(工具), 但是,我真正想要的是看起来像这样的结果。我该怎么做? 问题答案: 您需要使用以下选项: