溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Session重疊問題學習(五)--最優(yōu)化

發(fā)布時間:2020-08-10 15:34:05 來源:ITPUB博客 閱讀:129 作者:壹頁書 欄目:MySQL數(shù)據(jù)庫
周五晚上10點了.
這一周連續(xù)優(yōu)化Session合并和拆分問題.每天都比前一天提升性能一倍以上.
終于在今天,用獨創(chuàng)的小花貍Session合并算法達到了最優(yōu)級別.

令人振奮的1.5秒到2秒級別.

時間已經(jīng)很晚了,思路也有些不清晰了.先把代碼貼出來.下周再仔細解釋一下這個奇妙算法。

  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  

和之前的算法比較,結果一致?;旧隙荚?.6秒左右.
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI