Session重疊問題學習(九)--該問題第七次優化.優化合並演算法
接前文
Session重疊問題學習(二),這是問題和需求的描述,執行時間90秒
http://blog.itpub.net/29254281/viewspace-2150229/
Session重疊問題學習(三)--優化,一次優化後,執行時間25秒
http://blog.itpub.net/29254281/viewspace-2150259/
Session重疊問題學習(四)--再優化,二次優化後,執行時間10秒
http://blog.itpub.net/29254281/viewspace-2150297/
Session重疊問題學習(五)--最優化,三次優化後,執行時間1.6秒
http://blog.itpub.net/29254281/viewspace-2150339/
Session重疊問題學習(六)--極致優化,四次優化後,執行時間1250-1300毫秒
http://blog.itpub.net/29254281/viewspace-2150364/
Session重疊問題學習(七)--小花狸合併演算法和最後一次優化.第五次優化,980毫秒
http://blog.itpub.net/29254281/viewspace-2150403/
Session重疊問題學習(八)--該問題第六次優化和Oracle版本.第六次優化,880毫秒
http://blog.itpub.net/29254281/viewspace-2150464/
雖然經過反覆優化,還是需要880毫秒.
而Oracle僅僅需要200毫秒左右.
這主要是因為MySQL沒有提供開窗函式.在合併同一房間同一使用者的重合時間段時,需要大量掃描和計算.
這塊可以修改成遊標方式.減少掃描和計算.
本次優化之後,MySQL版本耗時420毫秒.
Session重疊問題學習(二),這是問題和需求的描述,執行時間90秒
http://blog.itpub.net/29254281/viewspace-2150229/
Session重疊問題學習(三)--優化,一次優化後,執行時間25秒
http://blog.itpub.net/29254281/viewspace-2150259/
Session重疊問題學習(四)--再優化,二次優化後,執行時間10秒
http://blog.itpub.net/29254281/viewspace-2150297/
Session重疊問題學習(五)--最優化,三次優化後,執行時間1.6秒
http://blog.itpub.net/29254281/viewspace-2150339/
Session重疊問題學習(六)--極致優化,四次優化後,執行時間1250-1300毫秒
http://blog.itpub.net/29254281/viewspace-2150364/
Session重疊問題學習(七)--小花狸合併演算法和最後一次優化.第五次優化,980毫秒
http://blog.itpub.net/29254281/viewspace-2150403/
Session重疊問題學習(八)--該問題第六次優化和Oracle版本.第六次優化,880毫秒
http://blog.itpub.net/29254281/viewspace-2150464/
雖然經過反覆優化,還是需要880毫秒.
而Oracle僅僅需要200毫秒左右.
這主要是因為MySQL沒有提供開窗函式.在合併同一房間同一使用者的重合時間段時,需要大量掃描和計算.
這塊可以修改成遊標方式.減少掃描和計算.
本次優化之後,MySQL版本耗時420毫秒.
- CREATE DEFINER=`root`@`localhost` PROCEDURE `p`()
- BEGIN
- declare done int default 0;
- declare v_roomid bigint;
- declare v_userid bigint;
- declare v_start timestamp;
- declare v_end timestamp;
- declare v_prev_roomid bigint default -1;
- declare v_prev_userid bigint default -1;
- declare v_max_end timestamp;
- declare cur_test CURSOR for select roomid,userid,roomstart,roomend from u_room_log order by roomid,userid,roomstart,roomend ;
- DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
- drop table if exists t;
- drop table if exists t1;
- drop table if exists tmp_time_point;
- drop table if exists tmp_s;
- create temporary table t(
- roomid bigint,
- userid bigint,
- s timestamp,
- e timestamp,
- broken int
- ) engine=memory;
- CREATE temporary TABLE `t1` (
- `roomid` int(11) NOT NULL DEFAULT '0',
- `userid` bigint(20) NOT NULL DEFAULT '0',
- `s` timestamp,
- `e` timestamp,
- primary key(roomid,userid,s,e)
- ) ENGINE=memory;
- create temporary table tmp_time_point(
- roomid bigint,
- timepoint timestamp,
- type smallint,
- key(roomid,timepoint)
- ) engine=memory;
- create temporary table tmp_s(
- roomid bigint,
- userid bigint,
- s timestamp,
- e timestamp,
- i int
- ) engine=memory;
- open cur_test;
- repeat
- fetch cur_test into v_roomid,v_userid,v_start,v_end;
- if done !=1 then
- if(v_roomid=v_prev_roomid and v_userid=v_prev_userid) then
- if(v_start<=v_max_end) then
- insert into t values(v_roomid,v_userid,v_start,v_end,0);
- else
- insert into t values(v_roomid,v_userid,v_start,v_end,1);
- end if;
- if(v_end>=v_max_end) then
- set v_max_end:=v_end;
- end if;
- set v_prev_roomid:=v_roomid;
- set v_userid:=v_userid;
- else
- set v_max_end:=v_end;
- set v_prev_roomid:=v_roomid;
- set v_prev_userid:=v_userid;
- insert into t values(v_roomid,v_userid,v_start,v_end,1);
- end if;
- end if;
- until done end repeat;
- close cur_test;
- insert into tmp_s
- select roomid,userid,min(s) s,max(e) e,datediff(max(e),min(s))+1 i from (
- select roomid,userid,s,e,case when @flag=flag then @rn:=@rn+broken when @flag:=flag then @rn:=broken end ran from (
- select roomid,userid,s,e,broken,concat(roomid,',',userid) flag from t,(select @flag:='',@rn:=0) vars
- ) a order by roomid,userid,s,e
- ) b
- group by roomid,userid,ran;
- select max(i) into @c from tmp_s;
- insert ignore into t1(roomid,userid,s,e)
- select
- roomid, userid,
- if(date(s)!=date(e) and id>1,date(s+interval id-1 day),s) s,
- if(date(s+interval id-1 day)=date(e) ,e,date_format(s+interval id-1 day,'%Y-%m-%d 23:59:59')) e
- from tmp_s t1 STRAIGHT_JOIN
- nums on(nums.id<=t1.i)
- where nums.id<=@c
- ;
- -- 開始點+1,結束點-1
- insert into tmp_time_point(roomid,timepoint,type) select roomid,s,1 from t1;
- insert into tmp_time_point(roomid,timepoint,type) select roomid,e,-1 from t1;
- select roomid,date(s) dt,round(sum(timestampdiff(second,date_format(s,'%Y-%m-%d %H:%i:%s'),date_format(e,'%Y-%m-%d %H:%i:%s')))/60) ts,max(rn) c from (
- select
- if(@roomid=roomid,@d,'') as s,@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') e ,rn
- from
- (
- select round(case when @roomid=roomid then @rn:=@rn+prevType when @roomid:=roomid then @rn:=prevType end) rn,b.prevType,roomid,timepoint,type from (
- select if(@roomid=roomid,@type,0) prevType ,case when @roomid=roomid then @type:=type when @roomid:=roomid then @type:=1 end,a.roomid,timepoint,type from (
- select * from ( select roomid,timepoint,sum(type) type from tmp_time_point group by roomid,timepoint) tmp_time_point,(select @roomid:=-1,@rn:=0,@type:=0) vars order by roomid ,timepoint
- ) a
- ) b order by roomid ,timepoint
- )p,(select @d:='',@roomid:=-1) vars
- order by roomid,timepoint
- ) v4 where s!='' and date(s)=date(e) and rn>=2
- group by roomid,date(s);
- END
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2150486/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Session重疊問題學習(三)--優化Session優化
- Session重疊問題學習(五)--最優化Session優化
- Session重疊問題學習(四)--再優化Session優化
- Session重疊問題學習(六)--極致優化Session優化
- Session重疊問題學習(八)--該問題第六次優化和Oracle版本Session優化Oracle
- Session重疊問題學習(一)Session
- Session重疊問題學習(七)--小花狸合併演算法和最後一次優化Session演算法優化
- webpack dll打包重複問題優化Web優化
- 【調優】設計問題還是優化問題?優化
- 凸優化問題優化
- 效能優化問題優化
- 斜率優化(凸包優化)DP問題acm優化ACM
- 03-凸優化問題優化
- Shiro效能優化:解決Session頻繁讀寫問題優化Session
- 數值最優化—優化問題的解(二)優化
- 【離散優化】覆蓋問題優化
- 記一個效能優化問題優化
- go的編譯優化問題Go編譯優化
- N皇后問題(各種優化)優化
- SQL優化--not in和or出的問題SQL優化
- SQL優化引出的問題(二)SQL優化
- SQL優化引出的問題(一)SQL優化
- 決策樹減支問題(優化)dfs減支問題優化
- TensorFlow系列專題(九):常用RNN網路結構及依賴優化問題RNN優化
- 【演算法】動態規劃-優化編輯器問題演算法動態規劃優化
- iOS問題整理08----效能優化iOS優化
- 對sql語句的優化問題SQL優化
- oracle效能問題:sql語句優化OracleSQL優化
- 關於sap效能優化的問題優化
- 網站搜尋引擎優化問題網站優化
- 資料庫sql的優化問題的面試題資料庫SQL優化面試題
- LayaAir引擎學習日誌14----LayaAir記憶體優化的問題AI記憶體優化
- (BFS廣度優先演算法) 油田問題演算法
- 演算法學習之路|日期問題演算法
- MySQL問題定位-效能優化之我見MySql優化
- RecyclerView使用,優化,條目閃爍問題View優化
- 【機器學習】--迴歸問題的數值優化機器學習優化
- 關於vue的webpack打包優化問題VueWeb優化