MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程

发布时间 - 2026-01-10 22:52:32    点击率:

最近有个特别变态的业务需求,有一张表

CREATE TABLE `demo` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `tid` int(11) DEFAULT '0',
 `pid` int(11) DEFAULT '1',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3000124 DEFAULT CHARSET=utf8;

大概就是这样,有300多万行记录,每个pid记录的这个ID的最顶级分类,tid是它的上级分类!
现在需求是:通过指定一个ID,查找出它的所有子集成员,并修改这个pid的值为新指定的值!!
在PHP中跑了一下,执行时间大概需要50秒+,很是痛苦!!!
需要递归找出所有子集,修改它的pid,工作量还是蛮大的。

而oracle中有一个方法是connect_by_isleaf,可以很方便的找出所有子集,但我是MySQL......

所以用这儿简单的写写用MySQL的方法或存储过程实现的经验

第一种:MySQL的方法

CREATE DEFINER=`root`@`localhost` FUNCTION `lvtao_demo_a`(rootId int) RETURNS text CHARSET utf8
  READS SQL DATA
  COMMENT 'demo'
BEGIN

DECLARE sTemp text;
DECLARE sTempChd text;

SET sTempChd =cast(rootId as CHAR);
SET sTemp = '';

WHILE sTempChd is not null DO
  SET sTemp = concat(sTemp,',',sTempChd);
  SELECT group_concat(id) INTO sTempChd FROM demo where FIND_IN_SET(tid,sTempChd)>0;
END WHILE;

RETURN sTemp;

END;

使用方法就是

select lvtao_demo_a(5);

但我在测试的时候,300万的数据基本上就是崩溃!!!

Data too long for column 'sTemp' at row 1

优点: 简单,方便,没有递归调用层次深度的限制 (max_sp_recursion_depth,最大255) ;
缺点:长度受限。

第二种:存储过程+中间表

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `sss`(IN pid int, IN rootid int)
BEGIN
   
DECLARE done INT DEFAULT FALSE;
DECLARE id TEXT;
DECLARE cur1 CURSOR FOR SELECT id FROM demo WHERE tid=pid;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

set max_sp_recursion_depth = 200;
 
OPEN cur1;
  read_loop: LOOP
    FETCH cur1 INTO id;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO temp (rootid,zid) values (rootid, id);
    call sss(id,rootid);
  END LOOP;
CLOSE cur1;

END;;
DELIMITER ;

哈哈,300万数据也卡成球了~~~

再想办法吧~~~~不折腾了


# MySQL  # connect_by_isleaf  # Linux 下mysql通过存储过程实现批量生成记录  # Mybatis调用MySQL存储过程的简单实现  # MySQL与Oracle差异比较之五存储过程&Function  # mysql 存储过程判断重复的不插入数据  # Java实现调用MySQL存储过程详解  # 在Mysql数据库里通过存储过程实现树形的遍历  # MySQL存储过程的优化实例  # 实例解析MySQL中的存储过程及存储过程的调用方法  # mysql的存储过程、游标 、事务实例详解  # 递归  # 存储过程  # 我是  # 我在  # 有个  # 中有  # 执行时间  # 跑了  # 很方便  # 第二种  # 第一种  # 值为  # 再想  # CLOSE  # PHP  # call  # values  # 也卡成球  # 多万行  # br 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在Windows虚拟主机上快速搭建网站?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何用好域名打造高点击率的自主建站?  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  如何在万网开始建站?分步指南解析  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  如何快速建站并高效导出源代码?  Laravel中的Facade(门面)到底是什么原理  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  千库网官网入口推荐 千库网设计创意平台入口  如何自定义建站之星模板颜色并下载新样式?  简历在线制作网站免费版,如何创建个人简历?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何在阿里云域名上完成建站全流程?  Laravel怎么在Controller之外的地方验证数据  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能  简历没回改:利用AI润色让你的文字更专业  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel如何发送系统通知?(Notification渠道示例)  Laravel如何使用Blade模板引擎?(完整语法和示例)  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  PythonWeb开发入门教程_Flask快速构建Web应用  Java解压缩zip - 解压缩多个文件或文件夹实例  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何在万网自助建站中设置域名及备案?  如何快速选择适合个人网站的云服务器配置?  如何选择可靠的免备案建站服务器?  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何快速搭建自助建站会员专属系统?  5种Android数据存储方式汇总  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  如何在Windows环境下新建FTP站点并设置权限?  Swift中swift中的switch 语句  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  详解Android图表 MPAndroidChart折线图  郑州企业网站制作公司,郑州招聘网站有哪些?  如何快速使用云服务器搭建个人网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  EditPlus中的正则表达式实战(6)  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案