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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- webpack dll打包重複問題優化Web優化
- MySQL優化學習手札(三)MySql優化
- Shiro效能優化:解決Session頻繁讀寫問題優化Session
- 《java學習三》jvm效能優化-------調優JavaJVM優化
- 【機器學習】--迴歸問題的數值優化機器學習優化
- 《java學習三》jvm效能優化------jconsulJavaJVM優化
- session共享問題???Session
- 凸優化問題優化
- 又出 bug 了 ?Safari 下文字和省略號重疊問題
- 強化學習-學習筆記11 | 解決高估問題強化學習筆記
- Android 百度地圖InfoWindow 出現重疊的問題Android地圖
- 斜率優化(凸包優化)DP問題acm優化ACM
- 強化學習實戰 | 表格型Q-Learning玩井子棋(三)優化,優化強化學習優化
- MySQL優化學習手札(四) 單表訪問方法MySql優化
- 網站效能優化的三重境界網站優化
- hibernate中的no session問題Session
- SQL優化案例-從執行計劃定位SQL問題(三)SQL優化
- Oracle優化案例-從執行計劃定位SQL問題(三)Oracle優化SQL
- 03-凸優化問題優化
- Spark學習——效能調優(三)Spark
- 數值最優化—優化問題的解(二)優化
- Fragment重影(重疊)白屏等問題原理解析,以及解決方案Fragment
- 自我學習與理解:keras框架下的深度學習(三)迴歸問題Keras框架深度學習
- react 學習 問題React
- 禁用 COOKIE 後如何訪問 SESSION 問題CookieSession
- SceneKit-解決模型重疊時渲染畫面閃爍的問題模型
- Python 機器學習 HMM模型三種經典問題Python機器學習HMM模型
- 【離散優化】覆蓋問題優化
- N皇后問題(各種優化)優化
- go的編譯優化問題Go編譯優化
- 記一個效能優化問題優化
- VuePress 部落格之 SEO 優化(三)標題、連結優化Vue優化
- Silverlight 2 學習筆記之事件的重複繫結問題筆記事件
- 斜率優化學習筆記優化筆記
- mysql left join 優化學習MySql優化
- Spark學習——問題排查Spark
- 面經問題學習
- 學習方向的問題
- 鄭建勳:程式碼優化的三重境界優化