天天看點

MySQL 優化百分比/比例計算

通常使用 SQL 語句求百分比時,需求掃描表兩次,一次是總數一次是滿足條件的個數

其實可以使用 INTERVAL 函數優化,隻掃描表一次(在表很大時,幾乎可以少花費一半的時間)

示例如下:

假設有一個分數表 TScore,包含班級,學号,平均分這3個字段(class, no, score)

現在想求每個班級的及格率(>=60人數/總人數*100)

一般方法:

select Total.class, Hit.num / Total.num *  as pass_rate
from
(select class, count() as num from TScore group by class) Total
left join
(select class, count() as num from TScore where score >=  group by class) Total
on Total.class = Hit.class
           

可以看出,需要掃描表 TScore 兩次

優化後:

select A.class, sum(if(A.i_s = , A.num, )) / sum(A.num) *  as pass_rate
(select class, INTERVAL(score, ) as i_s, count() as num from TScore group by class, i_s) A
group by A.class
           

可以看出,隻需要掃描表 TScore 一次,但需要對子查詢結果 A 掃描兩次

(INTERVAL 後分數大于等于60的索引為1,是以 sum(if(A.i_s = 1, A.num, 0)) 隻對及格人數求和)

結論:

當 TScore 較大,而子查詢結果 A 較小時,适合用這種方法優化