概览
通常使用 SQL 语句求百分比时,需求扫描表两次,一次是总数一次是满足条件的个数
其实可以使用 INTERVAL 函数优化,只扫描表一次(在表很大时,几乎可以少花费一半的时间)
示例
假设有一个分数表 TScore
,包含班级,学号,平均分这3个字段(class, no, score
)
现在想求每个班级的及格率(>=60人数/总人数*100)
一般方法
select Total.class, Hit.num Total.num * 100 as pass_rate
from
(select class, count(1) as num from TScore group by class) Total
left join
(select class, count(1) as num from TScore where score >= 60 group by class) Total
on Total.class = Hit.class复制
可以看出,需要扫描表 TScore
两次
优化后
select A.class, sum(if(A.i_s = 1, A.num, 0)) sum(A.num) * 100 as pass_rate
(select class, INTERVAL(score, 60) as i_s, count(1) 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 较小时,适合用这种方法优化
文章转载自进击的代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
MySQL8.0统计信息总结
闫建(Rock Yan)
573次阅读
2025-03-17 16:04:03
MySQL生产实战优化(利用Index skip scan优化性能提升257倍)
chengang
396次阅读
2025-03-17 10:36:40
MySQL数据库当前和历史事务分析
听见风的声音
361次阅读
2025-04-01 08:47:17
墨天轮个人数说知识点合集
JiekeXu
348次阅读
2025-04-01 15:56:03
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
335次阅读
2025-03-28 16:28:31
MySQL8.0直方图功能简介
Rock Yan
269次阅读
2025-03-21 15:30:53
MySQL 有没有类似 Oracle 的索引监控功能?
JiekeXu
255次阅读
2025-03-19 23:43:22
云和恩墨杨明翰:安全生产系列之MySQL高危操作
墨天轮编辑部
239次阅读
2025-03-27 16:45:26
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
238次阅读
2025-04-07 12:14:29
PG vs MySQL 执行计划解读的异同点
进击的CJR
160次阅读
2025-03-21 10:50:08