MySQL百分位數計算(再優化版)
前文的問題
第一版:
http://blog.itpub.net/29254281/viewspace-2157111/
第二版:
http://blog.itpub.net/29254281/viewspace-2157209/
第二版用時 33秒左右.
在原來的基礎上,稍加改進,即可提升三分之一的效能.
where round(rn/total,10)>=0.71
即 用定義的最小的百分位數進行過濾後,再group by
此時 查詢時間可以低至 20.531 s
當然,這個SQL還有進一步提升的空間
計算 某個百分位數的位置,有如下的公式:
loc=1+(n-1)*p,n是元素數,p是分位點。loc大小介於1和n之間
那麼SQL可以進行如下優化
除了本身簡化了SQL複雜度,查詢時間也低至 15秒左右
第一版:
http://blog.itpub.net/29254281/viewspace-2157111/
第二版:
http://blog.itpub.net/29254281/viewspace-2157209/
第二版用時 33秒左右.
在原來的基礎上,稍加改進,即可提升三分之一的效能.
-
select query_time,d,max(ts) ts from (
-
select t2.query_time,ts,rn,round(rn/total,10) percent,
-
case
-
when 0.71>=round(rn/total,10) then 0.71
-
when 0.81>=round(rn/total,10) then 0.81
-
when 0.91>=round(rn/total,10) then 0.91
-
end d
-
from (
-
select query_time,ts,
-
case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn
-
from (
-
select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts
-
) t1
-
) t2 inner join (
-
select query_time,count(*) total from t group by query_time
-
) t3 on(t2.query_time=t3.query_time)
-
where round(rn/total,10)>=0.71
-
) t6
-
where d is not null
- group by query_time,d
where round(rn/total,10)>=0.71
即 用定義的最小的百分位數進行過濾後,再group by
此時 查詢時間可以低至 20.531 s
當然,這個SQL還有進一步提升的空間
計算 某個百分位數的位置,有如下的公式:
loc=1+(n-1)*p,n是元素數,p是分位點。loc大小介於1和n之間
那麼SQL可以進行如下優化
-
select t5.query_time,t5.ts,t2.v from (
-
select query_time,total,v, floor(1+(total-1)*v) rn
-
from (
-
select query_time,count(*) total from t group by query_time
-
) t3, (select 0.71 v,1 seq union all select 0.81,2 union all select 0.91,3) t4
-
)
-
t2 inner join (
-
select
-
query_time,
-
case when @gid=query_time then @rn:=@rn+1 when @gid:=query_time then @rn:=1 end rn,
-
ts
-
from (
-
select * from t ,(select @gid:='',@rn:=0) vars order by query_time,ts
-
) t1
- ) t5 on (t2.query_time=t5.query_time and t2.rn=t5.rn )
除了本身簡化了SQL複雜度,查詢時間也低至 15秒左右
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2157299/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL百分位數計算(優化版)MySql優化
- MySQL百分位數計算(第三次優化)MySql優化
- Java計算百分比保留整數Java
- MySQL-建立計算欄位MySql
- MySQL優化之系統變數優化MySql優化變數
- 在 MySQL 中,如何計算一組資料的中位數?MySql
- MySQL設計與優化MySql優化
- MySQL效能優化 - 別再只會說加索引了MySql優化索引
- Java中計算百分比(DecimalFormat是NumberFormat的一個具體子類,用於格式化十進位制數字)JavaDecimalORM
- MySQL效能優化之索引設計MySql優化索引
- margin/padding百分比值的計算padding
- Mysql多欄位大表的幾種優化方法MySql優化
- 【MySQL】MySQL的執行計劃及索引優化MySql索引優化
- Dynamics CRM使用計算欄位自動計算兩個時間欄位的天數差
- mysql之 CentOS系統針對mysql引數優化MySqlCentOS優化
- MySQL 配置InnoDB配置非持久優化器統計資訊引數MySql優化
- Laravel 數量統計優化Laravel優化
- mysql優化MySql優化
- Mysql 優化MySql優化
- mysql 計算 一個文字欄位的內容一個文字出現的次數MySql
- 82. 落單的數 ( 位運算-統計 )
- python 計算中位數、四分位數、最大值、最小值等Python
- mysql格式化小數保留小數點後兩位(小數點格式化)MySql
- 另一個視角,使用對數化資料,計算非價位指標指標
- (mysql優化-3) 系統優化MySql優化
- arcgis欄位值計算(擷取A欄位前8位+按照順序計算8位)
- MySQL(二) MySql常用優化MySql優化
- 再見數字化轉型:對數字化轉型的再思考
- mysql優化(一)MySql優化
- mysql order by 優化MySql優化
- mysql效能優化MySql優化
- MySQL表優化MySql優化
- MySQL——效能優化MySql優化
- 舊,優化mysql優化MySql
- MySQL索引優化MySql索引優化
- mysql優化索引MySql優化索引
- SQL 如何計算每個分組的中位數SQL
- MySQL查詢優化之優化器工作流程以及優化的執行計劃生成MySql優化