掉坑了!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函数引发的线上问题     

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

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

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 简述交换机vlan配置步骤_华为交换机loopback配置

    简述交换机vlan配置步骤_华为交换机loopback配置交换机VLAN配置基础及实例有关VLAN的技术标准IEEE802.1Q早在1999年6月份就由IEEE委员正式颁布实施了,而且最早的VLNA技术早在1996年Cisco(思科)公司就提出了。随着几年来的发展,VLAN技术得到广泛的支持,在大大小小的企业网络中广泛应用,成为当前最为热门的一种以太局域网技术。本篇就要为大家介绍交换机的一个最常见技术应用–VLAN…

  • 【罗盘时钟(星空版)—使用html,js,css编写。(附全部源代码+效果)】[通俗易懂]

    【罗盘时钟(星空版)—使用html,js,css编写。(附全部源代码+效果)】[通俗易懂]效果换个背景:源代码index.html<!DOCTYPEhtml><htmllang=”en”><head><metacharset=”UTF-8″><title>CSDN—追梦者</title><linkrel=”stylesheet”href=”css/clock.css”></head><body><ulclass=”clock”id=”

  • 排名前十的时序数据库[通俗易懂]

    排名前十的时序数据库[通俗易懂]时序数据库全称为时间序列数据库。时间序列数据库主要用于指处理带时间标签(按照时间的顺序变化,即时间序列化)的数据,带时间标签的数据也称为时间序列数据。时序数据的兴起还是榜上了物联网的大风。物联网(InternetofThings,简称IOT)是指通过各种信息传感器实时采集任何需要管理设备的信息,并进行管理。物联网的基础数据具有数据量大、结构单一、时间属性强、查询简单等特点,传统的关系型数据库在面对物联网数据时,显得应对发力,基本上属于功能过剩但性能不足。目前最新的DB-Engine上时序数据库排名如下

  • Django用户登录与注册系统[通俗易懂]

    1.1.创建项目和appdjango-adminstartprojectmysite_loginpythonmanage.pystartapplogin1.2.设置时区和语言Django默认使用美国时间和英语,在项目的settings文件中,如下所示:LANGUAGE_CODE=’en-us’TIME_ZONE=’UTC’USE_I18N=TrueUSE_L1…

  • ubuntu12.04 安装rabbitvcs[通俗易懂]

    ubuntu12.04 安装rabbitvcs[通俗易懂]习惯了在windows下的Tortoisesvn,所以转到ubuntu下面很不习惯命令行的svn。而且,个人感觉如果需要showlog和diff的话都很不爽。今天和一个朋友聊天,他推荐我使用RabbitVCS。类似与Tortoisesvn。安装RabbitVCS的方法步骤如下:1、sudoadd-apt-repositoryppa:rabbitvcs/ppa     #将rab

  • CodeBlocks切换中文

    CodeBlocks切换中文下载汉化包,百度搜索“codeblock汉化包”即可, 比如:http://www.jb51.net/softs/545123.html将其拷贝到,此路径:X:\ProgramFil

发表回复

您的电子邮箱地址不会被公开。

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