一个mysql的group_concat导致的问题

这篇具有很好参考价值的文章主要介绍了一个mysql的group_concat导致的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  好久都没有写点东西了,是时候有点写东西的必要了。

  去年下年底离职了,躺了几个月,最近又兜兜转转换了一家公司继续当牛马了,前段时间八股文背了好多,难受呀,不过我也趁着前段时间自己也整理了属于我自己的八股文,有好几万字吧,哈哈哈,以后就不用到处去找八股文了。

  说回正题,这个group_concat的问题是最近在修复一个问题的时候发现的,是以前的人挖的坑,最近都不知道填了多少坑了,特喵的。

一. 问题背景

  一个机构树的表,就是那种有层级的,类似于下图这样的,然后我想查询某一个公司下所有部门的员工,我们就要把这个机构表递归找到一个公司下所有的部门,然后关联一下用户表查询就行了

一个mysql的group_concat导致的问题

 

  但是有人为了追求性能高一点,就把递归查询机构的逻辑使用使用find_in_set()函数和group_concat()函数封装成了mysq的自定义函数,然后调用的时候在sql级别进行处理了, 

DROP FUNCTION IF EXISTS queryChildrenAreaInfo;
DELIMITER ;;
CREATE FUNCTION queryChildrenAreaInfo(areaId INT)
RETURNS VARCHAR(4000)
BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);
SET sTemp='$';
SET sTempChd = CAST(areaId AS CHAR);
WHILE sTempChd IS NOT NULL DO
SET sTemp= CONCAT(sTemp,',',sTempChd);
SELECT GROUP_CONCAT(id) INTO sTempChd FROM t_areainfo WHERE FIND_IN_SET(parent_id,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
;;
DELIMITER ;

 

  使用这种方式,在测试环境肯定没问题,但是到了生产环境机构表数据多了之后肯定就会踩坑,GROUP_CONCAT(id)返回的数据有最大限制的,可以使用SHOW VARIABLES LIKE "group_concat_max_len" 进行查询,默认是1024个字节,下图所示。

  也就是如果查询的数据超过1024个字节后,只会保留前1024个字节的数据,至于修复方法,需要修改mysql配置文件或者使用sql语句临时修改:SET GLOBAL group_concat_max_len=10240000SET SESSION group_concat_max_len=10240000;

一个mysql的group_concat导致的问题

 

  如果没有修改的话,就可能导致一个问题,一样的代码在测试环境跑的很正常,一到生产上就拉胯,你肯定以为是代码哪里和生产不一致,可能比对了很久,然后测试环境自己也测试了n次,但就是生产上数据不完整,此时你就会两眼无神,怀疑人生....

 

二 解决方案

  2.1. 直接修改mysql的配置文件,扩大group_concat_max_len的最大容量,至于扩大到多少,就要靠你自己去根据数据量去衡量了,不过一般的开发也不想去为了这个一点问题就改生产数据库配置吧,麻烦....

  2.2 如果是oracle数据库,自带了递归查询的关键字:start with connect by prior, 有兴趣的可以自己研究一下,挺好用的,但是如果项目中是mysql数据库,那就不适用了

  2.3 使用sql进行递归查询,不过这种sql就是很鸡儿难看懂,要是让你维护这样的sql你想打人的心都有了,所以我也不是很推荐

-- 根据⼀个⽗节点为id为1 查询所有⼦节点(包含⾃⾝)
SELECT au.id, au.name, au.parent_id
  FROM (SELECT * FROM t_areainfo WHERE parent_id IS NOT NULL) au,
       (SELECT @pid := 1) pd
 WHERE FIND_IN_SET(parent_id, @pid) > 0
   AND @pid := concat(@pid, ',', id)
UNION
SELECT id, name, parent_id
  FROM t_areainfo
 WHERE id = '1'
 ORDER BY id;  

 

  2.4. 其实我们陷入了误区了,想一想有必要把这么复杂的逻辑都放到sql语句上处理么?其实这种越复杂的sql,会给服务器的压力也是倍增的,而且特别难排查出问题,这点是最致命的,因为只要能排查出来的问题就都不是问题。

  我的解决方案是: 首先查询出所有的机构信息,注意,如果机构信息太多,我们可以再细化,比如先查询一级机构,再查询二级机构....分批次去查询我们的数据,再内存级别进行组装; 然后根据我们查询的机构信息再调用一次数据库查询用户信息就好了,虽然和数据库交互可能多了两三次,但是逻辑变得简单了,有问题一下子就能排查出来了。

  错误示范: 先查询一级机构下所有的部门,然后遍历每一个部门分别再去数据库中查询下一级部门.....这样你会被打死的,千万不要循环中嵌套着查询数据库的逻辑

三 还有话说

  继续瞎逼逼几句,最近就是搞公司的历史遗留的项目,技术栈老,问题多,一个几万用户的对内商城项目,扣减库存的逻辑是查询数据库,内存中扣减了之后再将库存更新到数据库中......看到代码我都惊呆了呀。

  由于我刚来没几个月,之前听他们讨论有什么超卖问题,我想着这尼玛不超卖就出了鬼了, 然后我就提出了这个缺陷, 并使用了数据库乐观锁嘎嘎优化了。这段时间帮着压测这个商城项目,真的就是一堆破代码,我还要去给各种优化,性能起码提升了好多倍都不止,尼玛数据库关键的索引都有不加的,有的sql执行都需要好几秒的,加了索引之后30ms......

  继续苟着吧,现在这里最大的好处就是不怎么加班,干完自己的事情后五点半就可以走了,嘿嘿文章来源地址https://www.toymoban.com/news/detail-461044.html

到了这里,关于一个mysql的group_concat导致的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql~GROUP_CONCAT实现关系表的行转列

    GROUP_CONCAT 是 MySQL 中用于将查询结果集中的多行数据合并为单个字符串的聚合函数。它将每行数据的指定字段值连接起来,并以指定的分隔符分隔,最终返回一个包含所有值的字符串。 以下是 GROUP_CONCAT 函数的一般语法: column_name:要连接的字段名。 SEPARATOR:可选参数,用于

    2024年04月12日
    浏览(27)
  • Mysql 合并多个分组。GROUP_CONCAT 函数 及其平替函数

    GROUP_CONCAT 函数用于将一个分组内的多行数据合并成一个字符串,并以指定的分隔符进行分隔。常用于需要将一个分组内的多条数据以字符串的形式展示的情况。语法如下: GROUP_CONCAT(expr [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [, expr ...]] [SEPARATOR str_val]) 其中,expr 表示要

    2024年02月02日
    浏览(42)
  • mysql 查询的字段值太长显示不全 group_concat

    当前这个字段非常的长,在数据库看的时候也只是显示一部分内容,这是由于group_concat的group_concat_max_len参数的值太小造成的,默认值如下:  我们需要将这个值调大一点就可以解决上面这个问题了:  

    2024年02月11日
    浏览(32)
  • 【含面试】解锁MySQL group_concat的无限可能性:解决长度限制并实现高效查询

    AI绘画关于SD,MJ,GPT,SDXL百科全书 面试题分享点我直达 2023Python面试题 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java、python面试题 项目实战:AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象

    2024年02月04日
    浏览(36)
  • mysql 字符 1024个字符限制 cast转为varchar 不限制字符长度 最大字符长度 group_concat长度限制

    设置group_concat的最大长度然后再运行

    2024年02月16日
    浏览(44)
  • SQL Server实现group_concat函数

    情景:每个人有多张银行卡,现在需统计出每个人的银行卡并展示成一行,表单如下: 实现sql: group_concat() 函数将组中的字符串连接成为具有各种选项的单个字符串。 separator 指定在组中的值之间插入的文字值,默认 \\\' , \\\' 2.1 FOR XML PATH(\\\'\\\')函数,使结果集转为XML文档形式 2.2 转换

    2024年02月17日
    浏览(30)
  • Hive中的常用concat函数——concat函数、concat_ws函数和group_concat函数

    连接参数的函数,返回结果为连接参数的字符串。如果有一个参数为 NULL ,则返回的结果为 NULL 。 concat() 的一个特殊形式,表示 concat with separator ,两个参数之间加上特定的分隔符。返回的是用指定分隔符连接参数的字符串。如果分割符为 null ,则返回 null ,参数为 null ,则

    2024年02月02日
    浏览(31)
  • 【MySQL实践】一个隐蔽的问题导致 Field ‘xxx‘ doesn‘t have a default value

    最后在公司的后台系统上遇到了一个线上问题,是在插入某个表数据的时候出现了数据库的插入异常,即: java.sql.SQLException: Field \\\'xxx\\\' doesn\\\'t have a default value ,这其实是一个比较常见的异常,一般在 字段不能为null时 ,如果没有 显式的指定对应字段的值 就会抛出这个异常。

    2024年01月24日
    浏览(29)
  • 解决pandas的concat函数导致索引失效的方法

    最近在写数据的时候看到用一个concat函数进行整合,但是下面这段代码之后就碰上个很奇怪的地方 这段代码首先就是用dfs记录了每一组数据,最后使用concat函数进行连接。在这之后我希望在特定位置插入一列数据 一共有三种类型的文本,10条数据,在df格式下前面也有索引。

    2024年02月11日
    浏览(31)
  • 一个微软自带的 notepad 所导致的问题

    简 述: 纪录一个 Microsoft 自带的 notepad 所导致的问题,关于对 回车 和 换行 的解析。 测试小姐姐,报一个 bug 让康康先,说软件的日志在 Win10 x64 上,输出显示会多一行空格,而 Win7 x86 下则不会多此空行。我听后???同一个 .dll 还能跑出不同效果来???? 本文初发于

    2024年02月06日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包