文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Session重叠问题学习(五)--最优化

2024-04-02 19:55

关注
周五晚上10点了.
这一周连续优化Session合并和拆分问题.每天都比前一天提升性能一倍以上.
终于在今天,用独创的小花狸Session合并算法达到了最优级别.

令人振奋的1.5秒到2秒级别.

时间已经很晚了,思路也有些不清晰了.先把代码贴出来.下周再仔细解释一下这个奇妙算法。

  1. DELIMITER $$  
  2.   
  3. CREATE DEFINER=`root`@`localhost` PROCEDURE `p`()  
  4. BEGIN    
  5.     declare done int default 0;        
  6.     declare v_roomid bigint;    
  7.     declare v_time timestamp(6);    
  8.     declare v_cur_type smallint;  
  9.   
  10.     declare v_before_roomid bigint default -1;  
  11.     declare v_before_type smallint default -1;  
  12.     declare v_before_time timestamp(6) ;  
  13.   
  14.     declare v_num bigint default 0;  
  15.   
  16.   
  17.     declare cur_test CURSOR for select roomid,type,timepoint from tmp_time_point order by roomid,timepoint,type ;  
  18.     DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET done = 1;        
  19.   
  20.         
  21.     drop table if exists t1;    
  22.     drop table if exists t2;  
  23.     drop table if exists tmp_time_point;    
  24.     drop table if exists tmp_result;  
  25.     drop table if exists tmp_min_range;  
  26.   
  27.     CREATE temporary TABLE `t1` (    
  28.       `roomid` int(11) NOT NULL DEFAULT '0',    
  29.       `userid` bigint(20) NOT NULL DEFAULT '0',    
  30.       `s` timestamp(6),    
  31.       `e` timestamp(6),    
  32.       primary KEY `roomid` (`roomid`,`s`,`e`,`userid`)    
  33.     ) ENGINE=memory;    
  34.   
  35.    CREATE temporary TABLE `t2` (    
  36.       `roomid` int(11) NOT NULL DEFAULT '0',    
  37.       `s` timestamp(6),    
  38.       `e` timestamp(6),    
  39.       primary KEY `roomid` (`roomid`,`s`,`e`)    
  40.     ) ENGINE=memory;    
  41.   
  42.     CREATE temporary TABLE `tmp_min_range` (    
  43.       `roomid` int(11) NOT NULL DEFAULT '0',    
  44.       `s` timestamp(6),    
  45.       `e` timestamp(6),    
  46.       primary KEY `roomid` (`roomid`,`s`,`e`),  
  47.       key(roomid,e)  
  48.     ) ENGINE=memory;    
  49.   
  50.     create temporary table tmp_time_point(    
  51.             roomid bigint,    
  52.             timepoint timestamp(6),    
  53.             type smallint,  
  54.             key(roomid,timepoint)    
  55.     ) engine=memory;    
  56.       
  57.     create temporary table tmp_result(    
  58.             roomid bigint,    
  59.             timepoint timestamp(6),  
  60.             c int  
  61.     ) engine=memory;    
  62.     
  63. SET @A=0;    
  64. SET @B=0;    
  65. insert into t1(roomid,userid,s,e)  
  66. select distinct      
  67. roomid,  userid,      
  68. if(date(s)!=date(e) and id>1,date(s+interval id-1 date(s+interval id-1 date(e) ,e,date_format(s+interval id-1 '%Y-%m-%d 23:59:59')) e      
  69. from (      
  70.     SELECT x.roomid,x.userid,s,e    
  71.     FROM   
  72.     (  
  73.         (  
  74.             SELECT @B:=@B+1 AS id,roomid,userid,s    
  75.             FROM (    
  76.                 SELECT DISTINCT roomid, userid, roomstart AS s        
  77.                 FROM u_room_log a        
  78.                 WHERE NOT EXISTS (SELECT *        
  79.                     FROM u_room_log b        
  80.                     WHERE a.roomid = b.roomid        
  81.                         AND a.userid = b.userid        
  82.                         AND a.roomstart > b.roomstart        
  83.                         AND a.roomstart <= b.roomend)  
  84.             ) AS p  
  85.         ) AS x,    
  86.         (  
  87.             SELECT @A:=@A+1 AS id,roomid,userid,e    
  88.             FROM   
  89.             (    
  90.                 SELECT DISTINCT roomid, userid, roomend AS e        
  91.                 FROM u_room_log a        
  92.                 WHERE NOT EXISTS (SELECT *        
  93.                     FROM u_room_log b        
  94.                     WHERE a.roomid = b.roomid        
  95.                         AND a.userid = b.userid        
  96.                         AND a.roomend >= b.roomstart        
  97.                         AND a.roomend < b.roomend)    
  98.             ) AS o  
  99.         ) AS y    
  100.     )   
  101.     WHERE x.id = y.id AND x.roomid = y.roomid AND x.userid = y.userid      
  102. ) t1 ,      
  103. nums       
  104. where  nums.id<=datediff(e,s)+1      
  105. ;      
  106.   
  107. insert into t2 (roomid,s,e)  
  108. select roomid,  
  109. s+interval startnum/1000000 second s,  
  110. e-interval endnum/1000000 second e  
  111.  from (  
  112.     select   
  113.     roomid,  
  114.     s,e,  
  115.     startnum,  
  116.     when @eflag=eflag then @rn:=@rn+1 when @eflag:=eflag then @rn else @rn end endnum  
  117.     from (  
  118.         select * from (  
  119.             select when @sflag=sflag then @rn:=@rn+1 when @sflag:=sflag then @rn else @rn end startnum,roomid,s,e,sflag,eflag from  
  120.             (  
  121.                 select * from   
  122.                 (  
  123.                     select t1.*,concat('[',roomid,'],',s) sflag,concat('[',roomid,'],',e) eflag from t1 order by roomid ,sflag  
  124.                 )a,(select @sflag:='',@rn:=0,@eflag:='') vars  
  125.             ) b    
  126.         ) bb order by roomid,eflag  
  127.     ) c  
  128. ) d ;  
  129.    
  130.     insert into tmp_time_point(roomid,timepoint,type) select roomid,s,1 from t2;  
  131.     insert into tmp_time_point(roomid,timepoint,type) select roomid,e,0 from t2;  
  132.      
  133.     insert into tmp_min_range(roomid,s,e)  
  134.                 select distinct roomid,starttime  starttime, endtime  endtime from (    
  135.                     select     
  136.                     if(@roomid=roomid,@d,'')  as starttime,@d:=str_to_date(timepoint,'%Y-%m-%d %H:%i:%s.%f'),@roomid:=roomid,p.roomid,str_to_date(timepoint,'%Y-%m-%d %H:%i:%s.%f') endtime    
  137.                     from tmp_time_point p,(select @d:='',@roomid:=-1) vars    
  138.                     order by roomid,timepoint    
  139.                 ) v4 where starttime!='' and date(starttime)=date(endtime);  
  140.   
  141.     open cur_test;        
  142.     repeat        
  143.         fetch cur_test into v_roomid,v_cur_type,v_time;        
  144.         if done !=1 then      
  145.             -- 第一行或者每个房间的第一行  
  146.             if v_before_roomid=-1 or v_roomid!=v_before_roomid  then  
  147.                 set v_before_roomid:=v_roomid;  
  148.                 set v_before_type:=1;  
  149.                 set v_before_time:='0000-00-00 00:00:00';  
  150.                 set v_num:=0;  
  151.             end if;  
  152.               
  153.               
  154.             if v_before_type=1  then  
  155.            
  156.                 set v_num:=v_num+1;  
  157.         
  158.                 insert into tmp_result(roomid,timepoint,c) values(v_roomid,v_time,v_num);  
  159.             end if;  
  160.               
  161.             if v_before_type=0 then  
  162.                  
  163.                 set v_num:=v_num-1;  
  164.   
  165.                 insert into tmp_result(roomid,timepoint,c) values(v_roomid,v_time,v_num);  
  166.             end if;  
  167.   
  168.             set v_before_roomid:=v_roomid;  
  169.             set v_before_type:=v_cur_type;  
  170.             set v_before_time:=v_time;  
  171.         end if;      
  172.     until done end repeat;        
  173.     close cur_test;     
  174.     
  175.     select roomid,date(s) dt,round(second,date_format(s,'%Y-%m-%d %H:%i:%s'),date_format(e,'%Y-%m-%d %H:%i:%s')))/60) ts,max(c)-1 c from (       
  176.         select a.roomid,a.s,a.e,r.c,r.timepoint from tmp_result r   
  177.         inner join   
  178.         tmp_min_range a on( r.timepoint=a.e and r.roomid=a.roomid)  
  179.         where     c>2  
  180.     ) a group by roomid,date(s);    
  181.   
  182. END  

和之前的算法比较,结果一致。基本上都在1.6秒左右.
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯