加载中...
PAGE

mysql 树目录查询语句优化,提高查询效率

Post on 2021-10-28 37 0

在做mysql树目录查询的时候遇到了一个很奇妙的现象
我是先创建了一个树目录查询的函数叫 getDeptList()
然后单独执行查询函数的效率很快
树目录函数
时间
但当我放到sql语句里加个判断执行就会很慢了
执行语句
时间
累计查询出20条数据竟然要了0.5秒,那如果查出几百条不就1秒了 -_-||
后来想了一下可能是每次查询self_dept表的时候都会再执行一遍树目录的函数
然后就把sql语句改成了这样
sql
速度
可以看到,速度大幅度降低直接到了0.06
这里的优化思路是先计算好函数的结果,让函数只执行一遍,而不是根据self_dept表的判断进行多次计算

这里顺便记录一下mysql树目录排序的方法

sql:

select dept_id from (
    select t1.dept_id,
    if((find_in_set(parent_id, @pids) > 0 or find_in_set(dept_id, @pids) > 0), @pids := concat(@pids, ',', dept_id), 0) as ischild
    from (
        select dept_id,parent_id,dept_name from basis_sys_dept order by parent_id, dept_id
         ) t1,
			(select @pids := id) t2
		) t3 where ischild != 0

这个是可以直接写在sql语句内的,不过有个缺点:完全依靠排序,如果有子级在父级上面就会搜不到

sql:

delimiter // 
CREATE FUNCTION `getLst`(rootId INT) 
 RETURNS varchar(1000) 
 BEGIN 
   DECLARE sTemp VARCHAR(1000); 
  DECLARE sTempChd VARCHAR(1000); 
 
  SET sTemp = '$'; 
  SET sTempChd =cast(rootId as CHAR); 

  WHILE sTempChd is not null DO 
    SET sTemp = concat(sTemp,',',sTempChd); 
    SELECT group_concat(dept_id) INTO sTempChd FROM self_dept where FIND_IN_SET(parent_id,sTempChd)>0; 
  END WHILE; 
  RETURN sTemp; 
END 
//

这个是在mysql里创建一个函数,可以暂无发现什么bug(如有发现bug我会回来修改的)

(在复制使用的时候记得修改里面的表名和表字段 我的表:self_dept,id:dept_id,父级id:parent_id)

mysql 根据日期进行查询数据,没有数据也要显示空

mysql 根据日期进行查询数据,没有数据也要显示空

阅读更多
js 实现简易版深拷贝

js 实现简易版深拷贝

阅读更多
配置nginx无法通过ip或域名进行访问-阿里云ECS

配置nginx无法通过ip或域名进行访问-阿里云ECS

阅读更多

暂无评论

    发表评论
    返回顶部
    X