AI编程工作台搭建指南:工具选型、模型路由与配置实战
2026/9/20 7:02:55
创建两个功能相同但分别使用WHERE和HAVING的查询示例,展示它们的执行计划差异。要求:1) 使用学生成绩表;2) 查询平均分大于80的班级;3) 一个版本在WHERE中过滤,一个在HAVING中过滤;4) 分析两者的执行计划和性能差异。今天在优化一个学生成绩统计系统时,遇到了一个有趣的性能问题。同样的查询需求,使用WHERE和HAVING两种写法,执行效率竟然相差近3倍。这让我决定深入研究这两个关键字的区别,分享一些实际测试中的发现。
为了直观比较,我创建了一个简单的学生成绩表结构:
先来看需求:找出平均分大于80分的班级。这个需求可以有两种实现方式:
SELECT class_id, AVG(score) as avg_score FROM student_scores WHERE score > 80 GROUP BY class_idSELECT class_id, AVG(score) as avg_score FROM student_scores GROUP BY class_id HAVING AVG(score) > 80通过EXPLAIN命令查看两个查询的执行计划,发现了关键差异:
WHERE版本执行流程:
HAVING版本执行流程:
造成这种差异的核心在于SQL的执行顺序:
在测试环境中运行两个查询:
WHERE版本:
HAVING版本:
根据测试结果,总结出几个优化原则:
虽然WHERE通常更高效,但HAVING在以下场景不可替代:
在我们的成绩系统中,最终采用了混合策略:
这种优化使系统查询速度提升了40%,特别是在期末统计高峰时段效果显著。
经过这次优化,我深刻体会到:
如果你也在处理类似的数据统计需求,建议在InsCode(快马)平台上快速验证不同写法的执行计划。这个在线工具可以即时看到SQL的执行效果,还能一键部署测试环境,特别适合做这类性能对比实验。我实际操作发现,不用搭建本地数据库就能完成各种SQL优化测试,对开发者来说真的很方便。
创建两个功能相同但分别使用WHERE和HAVING的查询示例,展示它们的执行计划差异。要求:1) 使用学生成绩表;2) 查询平均分大于80的班级;3) 一个版本在WHERE中过滤,一个在HAVING中过滤;4) 分析两者的执行计划和性能差异。