通常使用 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 較小時,适合用這種方法優化