掉坑了!GROUP_CONCAT函数引发的线上问题

怕什么真理无穷,进一步有近一步的欢喜本文分享一篇在工作遇到的一个问题,关于MySQL GROUP_CONCAT函数导致的问题。希望能帮忙到你。开头聊几句一年又一年,2020这一年眼看就要…

大家好,又见面了,我是全栈君。

怕什么真理无穷,进一步有近一步的欢喜

掉坑了!GROUP_CONCAT函数引发的线上问题

本文分享一篇在工作遇到的一个问题,关于MySQL GROUP_CONCAT函数导致的问题。希望能帮忙到你。

开头聊几句

一年又一年,2020这一年眼看就要结束了,真是逝者如斯夫,不舍昼夜。

工作和生活都需要更多的责任和担当了,一年一年慢慢的发生变化。

业务场景

在说遇到的坑之前,先描述一下大致的业务场景。系统有一个排班的功能,一个医生一天可以排多种业务类型的排班,并且每一种业务类型的排班都支持排个多时段(时段的最小单位是15分钟)。

举例:
D医生在 2020-12-31 的 8:00~10:00、10:30~12:00  排班了【在线A】 和 【在线B】业务。

【在线A】 2020-12-31 8:00~10:00
【在线A】 2020-12-31 10:30~12:00
【在线B】 2020-12-31 8:00~10:00
【在线B】 2020-12-31 10:30~12:00

在查询这个一天排班的数据,伪SQL方便理解:

SELECT
 dt,
 biz_type,
 GROUP_CONCAT(
  CONCAT_WS('|', id, start_time, end_time)
 ) AS multiPeriodDetail
FROM
 doctor_schedule_detail
WHERE
 doctor_id = '456231'
AND dt = '2020-12-30'
GROUP BY
 doctor_id,
 biz_type,
 dt

CONCAT_WS(‘|’, id, start_time, end_time)中的字段说明:

  • id:时段的id

  • start_time:时段开始时间

  • end_time:时段结束时间

对数据进行分组后,使用 CONCAT_WS函数 指定分隔符进行参数拼接。然后使用 GROUP_CONCAT 函数 返回分组中字符串结果组合连接的值,默认缺省为一个逗号 (“,”)进行分隔,这个缺省值可以去掉,本例子中使用默认缺省值。

查询后结果展示如下:

掉坑了!GROUP_CONCAT函数引发的线上问题

查询结果

至此场景描述结束。

遇到的坑

这个代码在线上已经运行很长了,有一天用户反馈说给D医生排班了,但是界面查不到这个时段的排班数据。

经过”紧张激烈”的排查,终于找到了这个问题的罪魁祸首。

如上场景描述,在查询SQL中使用了 GROUP_CONCAT 函数,在业务中因为排班的最小时段为:单位是15分钟。正常医生不会拍很多很细的班,但在特殊的场景中,有一些医生就是15分钟排一次班,而且系统中真实的 CONCAT_WS函数拼接返回的字段比较多,那么导致查询出来的数据非常多, GROUP_CONCAT 函数就就大于默认值得数据丢弃了。

:GROUP_CONCAT 对应的配置参数 group_concat_max_len 默认设置最大的长度 1024字节

查询 group_concat_max_len 配置:

show variables like "group_concat_max_len";

tips:字段内容字节长度

MySQL utf-8 编码集, 一个中文占3个字节。

-- 字符长度 输出结果:6
SELECT CHAR_LENGTH("你好2021")
-- 字节长度 输出结果:10
SELECT LENGTH("你好2021")

解决方案

在知道问题原因后,就有了对应的解决方案。
第一种方案:修改Mysql的配置,调整 group_concat_max_len 的值。

方法一:在MySQL的配置文件中加入如下配置(推荐):

group_concat_max_len = 102400
方法二:更简单的操作方法,执行SQL语句:

SET GLOBAL group_concat_max_len = 102400;

SET SESSION group_concat_max_len = 102400;

生产环境,肯定要用方法一:在MySQL的配置文件。但考虑生产环境修改配置需要走一些流程和审批,于是有了第二种方案的考虑。

第二种方案:进行业务功能的调整,需求的调整或者GROUP_CONCAT 拼接少返回一些数据

功能已经上线,此时在修改,对业务有一定的影响

综合考虑后,决定更改group_concat_max_len的值,经过对业务的分析计算出具体要更改的值。

结语

在真实场景中,大多数问题的解决方案不止一种,在权衡后找到一个符合当时的问题的最优解决方案。

See you next good day~

Java编程技术乐园:分享干货技术,每天进步一点点,小的积累,带来大的改变。后台回复【秘籍】获取精选资料

文章推荐

2分钟规则

MySQL中使用IN会不会走索引分析

用MySQL 执行计划分析 DATE_FORMAT 函数对索引的影响

掉坑了!GROUP_CONCAT函数引发的线上问题     

谢谢你的阅读,愿你有所收获,也欢迎留言一起讨论

如果觉得本文对你有所帮助,欢迎转发。您的点赞和转发,就是对我最大的鼓励

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120961.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月1日 上午7:00
下一篇 2022年3月1日 上午8:00


相关推荐

  • Linux nohup命令用法详解

    Linux nohup命令用法详解nohup 英文全称 nohangup 不挂起 用于在系统后台不挂断地运行命令 退出终端不会影响程序的运行 nohup 命令 在默认情况下 非重定向时 会输出一个名叫 nohup out 的文件到当前目录下 如果当前目录的 nohup out 文件不可写 输出重定向到 HOME nohup out 文件中 语法格式 nohupCommand Arg amp 参数说明 Command 要执行的命令 Arg 一些参数 可以指定输出文件 amp am

    2026年3月26日
    3
  • PM3激活成功教程加密IC卡

    PM3激活成功教程加密IC卡IC卡已经在我们的生活中无处不在了,门禁,电梯,吃饭,洗车,可以说与我们的生活息息相关了。(为了把加密的校园一卡通复制到我的小米手环上,我也是煞费苦心,看网上各种大佬教程)但是如果有一天,你的门禁卡丢了,怎么配呢?跟配钥匙一样的,必须现有原钥匙才可以。那我们今天就看看,如何用PM3来配门禁卡钥匙。准备好门禁母卡和复制的空白卡,复制的全过程是这样的。放原卡-》读卡-》激活成功教程密码-》读出数据-》放新卡-》写入数据-》完成复制!1、连接好PM3硬件设备,运行我们的杀手锏软件PM3的gui版本很多,我们

    2022年6月25日
    68
  • 常见的黑盒测试方法有哪些_黑盒测试方法10种

    常见的黑盒测试方法有哪些_黑盒测试方法10种常见的黑盒测试方法

    2022年10月3日
    3
  • IGMP协议原理与配置[通俗易懂]

    IGMP协议原理与配置[通俗易懂]组播通信中,发送者将组播数据数据发送到特定的组播地址。

    2025年11月17日
    6
  • pom.xml

    pom.xml

    2022年2月22日
    60
  • MPP数据库简介

    MPP数据库简介MPP 架构是将任务并行的分散到多个服务器和节点上 在每个节点上计算完成后 将各自部分的结果汇总在一起得到最终的结果 采用 MPP 架构的数据库称为 MPP 数据库

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号