Session重疊問題學習(三)--優化
接前文
http://blog.itpub.net/29254281/viewspace-2150229/
前文中的演算法想了一天半,終於在昨天晚上得出了正確的結果.
在我的環境中,耗時90s ,還有進一步優化的空間.
首選是生成 t1 和 t2的方式.
之前使用create table 方式 導致型別不對,
因為是臨時作用的表,所以可以預先建立表結構
CREATE 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`),
KEY (`roomid`,`s`,`e`)
) ;
CREATE TABLE `t2` (
`roomid` int(11) NOT NULL DEFAULT '0',
`userid` bigint(20) NOT NULL DEFAULT '0',
`s` timestamp ,
`e` timestamp,
primary KEY (`roomid`,`userid`,`s`,`e`),
KEY (`roomid`,`s`,`e`)
) ;
前文中的第一步可以封裝為一個過程
函式修改如下
原來是針對每天每個房間處理,經過優化對某天的所有房間進行處理,批量的形式更快
另外在中間過程增加了型別轉換,可以更好的利用索引
select roomid,CAST(starttime as DATETIME) starttime,CAST(endtime as DATETIME) endtime
另外第7行 原來沒有 distinct 可能導致bug
select distinct v6.roomid,v6.userid,greatest(s,starttime) s,least(e,endtime) e
呼叫時執行:
truncate table t1;
truncate table t2;
call p;
select f(s) from (
select distinct date(s) s from t1
) t
兩步的執行時間:
今天優化了一天,從90s優化到25s以內,已經達到了預期。
我覺得在單執行緒環境,基本上已經達到最優.
如果還想優化到極致,第二步的函式執行,可以通過JAVA程式多執行緒一起跑,只要伺服器CPU核數多,優化效果應該還是很明顯的。
http://blog.itpub.net/29254281/viewspace-2150229/
前文中的演算法想了一天半,終於在昨天晚上得出了正確的結果.
在我的環境中,耗時90s ,還有進一步優化的空間.
首選是生成 t1 和 t2的方式.
之前使用create table 方式 導致型別不對,
因為是臨時作用的表,所以可以預先建立表結構
CREATE 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`),
KEY (`roomid`,`s`,`e`)
) ;
CREATE TABLE `t2` (
`roomid` int(11) NOT NULL DEFAULT '0',
`userid` bigint(20) NOT NULL DEFAULT '0',
`s` timestamp ,
`e` timestamp,
primary KEY (`roomid`,`userid`,`s`,`e`),
KEY (`roomid`,`s`,`e`)
) ;
前文中的第一步可以封裝為一個過程
- DELIMITER $$
- CREATE DEFINER=`root`@`localhost` PROCEDURE `p`()
- BEGIN
- insert into t1
- select distinct
- 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 (
- SELECT DISTINCT s.roomid, s.userid, s.s, (
- SELECT MIN(e)
- FROM (SELECT DISTINCT roomid, userid, roomend AS e
- FROM u_room_log a
- WHERE NOT EXISTS (SELECT *
- FROM u_room_log b
- WHERE a.roomid = b.roomid
- AND a.userid = b.userid
- AND a.roomend >= b.roomstart
- AND a.roomend < b.roomend)
- ) s2
- WHERE s2.e > s.s
- AND s.roomid = s2.roomid
- AND s.userid = s2.userid
- ) AS e
- FROM (SELECT DISTINCT roomid, userid, roomstart AS s
- FROM u_room_log a
- WHERE NOT EXISTS (SELECT *
- FROM u_room_log b
- WHERE a.roomid = b.roomid
- AND a.userid = b.userid
- AND a.roomstart > b.roomstart
- AND a.roomstart <= b.roomend)
- ) s, (SELECT DISTINCT roomid, userid, roomend AS e
- FROM u_room_log a
- WHERE NOT EXISTS (SELECT *
- FROM u_room_log b
- WHERE a.roomid = b.roomid
- AND a.userid = b.userid
- AND a.roomend >= b.roomstart
- AND a.roomend < b.roomend)
- ) e
- WHERE s.roomid = e.roomid
- AND s.userid = e.userid
- ) t1 ,
- nums
- where nums.id<=datediff(e,s)+1
- ;
- END
函式修改如下
- DELIMITER $$
- CREATE DEFINER=`root`@`localhost` FUNCTION `f`(pTime timestamp) RETURNS int(11)
- BEGIN
- declare pResult bigint;
- insert into t2
- select distinct v6.roomid,v6.userid,greatest(s,starttime) s,least(e,endtime) e
- from (
- select roomid,CAST(starttime as DATETIME) starttime,CAST(endtime as DATETIME) endtime from (
- select @d as starttime,@d:=d,v3.roomid,v3.d endtime from (
- select distinct roomid,
- case
- when nums.id=1 then v1s
- when nums.id=2 then v1e
- when nums.id=3 then v2s
- when nums.id=4 then v2e
- end d from (
- select v1.roomid, v1.s v1s,v1.e v1e,v2.s v2s,v2.e v2e
- from t1 v1
- inner join t1 v2 on ((v1.s between v2.s and v2.e or v1.e between v2.s and v2.e ) and v1.roomid=v2.roomid)
- where v2.roomid in(select distinct roomid from t1 where date(s)=pTime)
- and v2.s>=pTime and v2.s<(pTime+interval '1' day) and (v2.roomid,v2.userid,v2.s,v2.e)!= (v1.roomid,v1.userid,v1.s,v1.e)
- ) a,nums where nums.id<=4
- order by roomid,d
- ) v3,(select @d:='') vars
- ) v4 where starttime!=''
- ) v5 inner join t1 v6 on(v5.starttime between v6.s and v6.e and v5.endtime between v6.s and v6.e and v5.roomid=v6.roomid)
- ;
- select row_count() into pResult;
- RETURN pResult;
- END
原來是針對每天每個房間處理,經過優化對某天的所有房間進行處理,批量的形式更快
另外在中間過程增加了型別轉換,可以更好的利用索引
select roomid,CAST(starttime as DATETIME) starttime,CAST(endtime as DATETIME) endtime
另外第7行 原來沒有 distinct 可能導致bug
select distinct v6.roomid,v6.userid,greatest(s,starttime) s,least(e,endtime) e
呼叫時執行:
truncate table t1;
truncate table t2;
call p;
select f(s) from (
select distinct date(s) s from t1
) t
兩步的執行時間:
今天優化了一天,從90s優化到25s以內,已經達到了預期。
我覺得在單執行緒環境,基本上已經達到最優.
如果還想優化到極致,第二步的函式執行,可以通過JAVA程式多執行緒一起跑,只要伺服器CPU核數多,優化效果應該還是很明顯的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2150259/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Session重疊問題學習(五)--最優化Session優化
- Session重疊問題學習(四)--再優化Session優化
- Session重疊問題學習(六)--極致優化Session優化
- Session重疊問題學習(一)Session
- Session重疊問題學習(八)--該問題第六次優化和Oracle版本Session優化Oracle
- Session重疊問題學習(九)--該問題第七次優化.優化合並演算法Session優化演算法
- Session重疊問題學習(七)--小花狸合併演算法和最後一次優化Session演算法優化
- MySQL優化學習手札(三)MySql優化
- webpack dll打包重複問題優化Web優化
- 《java學習三》jvm效能優化-------調優JavaJVM優化
- Shiro效能優化:解決Session頻繁讀寫問題優化Session
- 《java學習三》jvm效能優化------jconsulJavaJVM優化
- MySql 學習筆記三:常用SQL優化MySql筆記優化
- TensorFlow學習(三):Graph和SessionSession
- oracle performance tuning效能優化學習系列(三)OracleORM優化
- 凸優化問題優化
- 效能優化問題優化
- 【調優】設計問題還是優化問題?優化
- MongoDB副本集學習(三):效能和優化相關MongoDB優化
- 【OpenCV學習】計算兩幅影象的重疊區域OpenCV
- 強化學習-學習筆記11 | 解決高估問題強化學習筆記
- LayaAir引擎學習日誌14----LayaAir記憶體優化的問題AI記憶體優化
- 網站效能優化的三重境界網站優化
- 如何避開jquery動態繫結的事件重疊問題jQuery事件
- MySQL優化學習手札(四) 單表訪問方法MySql優化
- oracle performance tuning效能優化學習系列(三)_補二OracleORM優化
- oracle performance tuning效能優化學習系列(三)_補一OracleORM優化
- Spark學習——效能調優(三)Spark
- session共享問題???Session
- 強化學習實戰 | 表格型Q-Learning玩井子棋(三)優化,優化強化學習優化
- 斜率優化(凸包優化)DP問題acm優化ACM
- 自我學習與理解:keras框架下的深度學習(三)迴歸問題Keras框架深度學習
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- Fragment重影(重疊)白屏等問題原理解析,以及解決方案Fragment
- Android 百度地圖InfoWindow 出現重疊的問題Android地圖
- react 學習 問題React
- hive學習之三:專案中的hive優化實踐Hive優化