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

 更新时间:2017年02月05日 20:18:07   投稿:mdxy-dxy  
这篇文章主要介绍了MySQL实现类似于connect_by_isleaf的功能MySQL方法或存储过程,需要的朋友可以参考下

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

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 动态执行存储过程语句

    mysql 动态执行存储过程语句

    MSSQL中动态执行sql语句可以使用EXEC()函数。MSSQL中也有类似的函数EXECUTE(),不过不同的是MYSQL中动态执行存储过程语句与MSSQL还是有区别的。
    2009-07-07
  • MySQL利用procedure analyse()函数优化表结构

    MySQL利用procedure analyse()函数优化表结构

    不知道是否遇到过为MySQL表结构该选择什么类型字段而郁闷?或者为MySQL字段该选择多少长度而纠结?下面这篇文章就给大家介绍一个武林秘籍吧~也是我最近才学来的,感兴趣的朋友们下面来一起看看吧。
    2016-12-12
  • mysql 初始执行文件的使用介绍

    mysql 初始执行文件的使用介绍

    本文将详细介绍mysql 初始执行文件的使用方法,现在晒出来和大家分享下,希望可以帮助你们
    2012-11-11
  • MySQL慢查询相关参数原理解析

    MySQL慢查询相关参数原理解析

    这篇文章主要介绍了MySQL慢查询相关参数原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 如何备份MySQL数据库

    如何备份MySQL数据库

    网站数据对我们对站长来说都是最宝贵的,我们平时应该养成良好的备份数据的习惯。这样可使我们数据库崩溃造成的损失大大降低
    2015-01-01
  • MySQL数据库中CAST与CONVERT函数实现类型转换的讲解

    MySQL数据库中CAST与CONVERT函数实现类型转换的讲解

    今天小编就为大家分享一篇关于MySQL数据库中CAST与CONVERT函数实现类型转换的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • mysql存储过程事务管理简析

    mysql存储过程事务管理简析

    本文将提供了一个绝佳的机制来定义、封装和管理事务,需要的朋友可以参考下
    2012-11-11
  • MySQL Hash索引和B-Tree索引的区别

    MySQL Hash索引和B-Tree索引的区别

    MySQL Hash索引和B-Tree索引的区别究竟在哪里呢?相信很多人都有这样的疑问,下文对两者的区别进行了详细的分析,需要的朋友可以参考下
    2014-03-03
  • MySQL GTID全面总结

    MySQL GTID全面总结

    这篇文章主要介绍了MySQL GTID的相关资料,帮助大家更好的理解和学习使用MySQL数据库,感兴趣的朋友可以了解下
    2021-03-03
  • SQL实现相邻两行数据的加减乘除操作

    SQL实现相邻两行数据的加减乘除操作

    这篇文章主要介绍了SQL实现相邻两行数据的加减乘除操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10

最新评论