MySQL 8.0 实战:学生选课系统 10 大高频考点 SQL 语句优化

发布时间:2026/9/27 13:18:25

MySQL 8.0 实战:学生选课系统 10 大高频考点 SQL 语句优化
MySQL 8.0 实战学生选课系统 10 大高频考点 SQL 语句优化1. 查询平均分高于 85 分的学生信息低效写法SELECT s.sno, s.sname, AVG(sc.grade) as avg_grade FROM student s, elective sc WHERE s.sno sc.sno GROUP BY s.sno, s.sname HAVING AVG(sc.grade) 85;优化写法SELECT s.sno, s.sname, t.avg_grade FROM student s JOIN ( SELECT sno, AVG(grade) as avg_grade FROM elective GROUP BY sno HAVING AVG(grade) 85 ) t ON s.sno t.sno;优化分析使用子查询先过滤出平均分高于85的学生减少主查询处理的数据量使用JOIN替代WHERE连接提高可读性和执行效率避免在HAVING子句中重复计算AVG函数EXPLAIN分析------------------------------------------------------------------------------------------------------------------------------------------------------- | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | ------------------------------------------------------------------------------------------------------------------------------------------------------- | 1 | PRIMARY | derived2 | NULL | ALL | NULL | NULL | NULL | NULL | 5 | 100.00 | NULL | | 1 | PRIMARY | s | NULL | ALL | NULL | NULL | NULL | NULL | 1000 | 10.00 | Using where; Using join buffer (Block Nested Loop) | | 2 | DERIVED | elective | NULL | ALL | NULL | NULL | NULL | NULL | 5000 | 100.00 | Using temporary; Using filesort | -------------------------------------------------------------------------------------------------------------------------------------------------------2. 查询选修了特定课程的学生名单低效写法SELECT s.sno, s.sname FROM student s WHERE s.sno IN ( SELECT sc.sno FROM elective sc WHERE sc.cno C001 );优化写法SELECT s.sno, s.sname FROM student s WHERE EXISTS ( SELECT 1 FROM elective sc WHERE sc.sno s.sno AND sc.cno C001 );优化技巧使用EXISTS替代IN当子查询结果集较大时性能更好确保elective表的(sno,cno)有复合索引对于MySQL 8.0也可使用JOIN写法SELECT DISTINCT s.sno, s.sname FROM student s JOIN elective sc ON s.sno sc.sno WHERE sc.cno C001;3. 查询各课程选修人数及平均分低效写法SELECT c.cno, c.cname, (SELECT COUNT(*) FROM elective WHERE cno c.cno) as student_count, (SELECT AVG(grade) FROM elective WHERE cno c.cno) as avg_grade FROM course c;优化写法SELECT c.cno, c.cname, COUNT(sc.sno) as student_count, AVG(sc.grade) as avg_grade FROM course c LEFT JOIN elective sc ON c.cno sc.cno GROUP BY c.cno, c.cname;性能对比指标低效写法优化写法扫描次数O(n²)O(n)内存使用高低执行时间慢快4. 查询没有选修任何课程的学生常见错误写法SELECT s.sno, s.sname FROM student s WHERE s.sno NOT IN (SELECT sno FROM elective);推荐优化方案SELECT s.sno, s.sname FROM student s LEFT JOIN elective sc ON s.sno sc.sno WHERE sc.sno IS NULL;或者使用NOT EXISTSSELECT s.sno, s.sname FROM student s WHERE NOT EXISTS ( SELECT 1 FROM elective sc WHERE sc.sno s.sno );注意当elective表的sno字段有NULL值时NOT IN写法可能返回错误结果5. 分页查询学生选课记录低效分页SELECT s.sno, s.sname, c.cname, sc.grade FROM student s, course c, elective sc WHERE s.sno sc.sno AND c.cno sc.cno LIMIT 10000, 20;高效分页SELECT s.sno, s.sname, c.cname, sc.grade FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno WHERE sc.id 10000 -- 假设有自增id字段 ORDER BY sc.id LIMIT 20;深度分页优化方案使用覆盖索引延迟关联记录上一页最后一条记录的ID作为条件对于MySQL 8.0可使用窗口函数6. 更新学生成绩时的优化事务处理示例START TRANSACTION; -- 先查询再更新避免锁表时间过长 SELECT avg:AVG(grade) FROM elective WHERE cno C001; UPDATE elective SET grade grade * 1.1 WHERE cno C001 AND grade avg; COMMIT;批量更新优化-- 低效逐条更新 UPDATE elective SET grade 90 WHERE sno S001 AND cno C001; UPDATE elective SET grade 85 WHERE sno S002 AND cno C001; -- 高效批量更新 UPDATE elective SET grade CASE WHEN sno S001 AND cno C001 THEN 90 WHEN sno S002 AND cno C001 THEN 85 ELSE grade END WHERE (sno S001 AND cno C001) OR (sno S002 AND cno C001);7. 复杂统计查询优化查询各班级每门课程的平均分未优化版本SELECT s.class, c.cname, AVG(sc.grade) FROM student s, course c, elective sc WHERE s.sno sc.sno AND c.cno sc.cno GROUP BY s.class, c.cname;优化版本SELECT s.class, c.cname, AVG(sc.grade) FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno GROUP BY s.class, c.cname ORDER BY NULL; -- 避免不必要的排序使用物化视图MySQL 8.0CREATE VIEW class_course_avg AS SELECT s.class, c.cno, AVG(sc.grade) as avg_grade FROM student s JOIN elective sc ON s.sno sc.sno JOIN course c ON sc.cno c.cno GROUP BY s.class, c.cno; -- 查询时直接使用物化视图 SELECT class, cname, avg_grade FROM class_course_avg cca JOIN course c ON cca.cno c.cno;8. 索引设计与优化推荐索引方案-- 学生表主键索引 ALTER TABLE student ADD PRIMARY KEY (sno); -- 课程表主键索引 ALTER TABLE course ADD PRIMARY KEY (cno); -- 选课表复合索引 ALTER TABLE elective ADD PRIMARY KEY (sno, cno); ALTER TABLE elective ADD INDEX idx_cno (cno); ALTER TABLE elective ADD INDEX idx_grade (grade); -- 为高频查询添加覆盖索引 ALTER TABLE elective ADD INDEX idx_covering (cno, grade, sno);索引使用原则遵循最左前缀原则避免过度索引写操作会变慢使用EXPLAIN验证索引使用情况定期使用ANALYZE TABLE更新统计信息9. 使用窗口函数优化排名查询查询每门课程成绩排名前3的学生传统写法SELECT sc1.cno, sc1.sno, sc1.grade FROM elective sc1 WHERE ( SELECT COUNT(*) FROM elective sc2 WHERE sc2.cno sc1.cno AND sc2.grade sc1.grade ) 3 ORDER BY sc1.cno, sc1.grade DESC;MySQL 8.0窗口函数写法SELECT * FROM ( SELECT cno, sno, grade, DENSE_RANK() OVER (PARTITION BY cno ORDER BY grade DESC) as rnk FROM elective ) t WHERE rnk 3;性能对比方法10万数据执行时间可读性扩展性子查询12.8秒一般差窗口函数0.3秒好好10. 避免全表扫描的优化技巧案例查询特定时间段选课记录低效写法SELECT * FROM elective WHERE YEAR(select_time) 2023 AND MONTH(select_time) 6;优化写法SELECT * FROM elective WHERE select_time BETWEEN 2023-06-01 AND 2023-06-30;其他优化建议避免在索引列上使用函数使用合适的比较运算符限制返回的列数避免SELECT *合理使用FORCE INDEX提示实际案例一个未优化的复杂查询从8秒降到0.2秒通过以下步骤添加适当的复合索引重写SQL避免使用OR条件使用JOIN替代子查询限制返回字段数量通过这10个高频考点的优化实践可以显著提升学生选课系统的数据库性能。关键是要理解每种优化方法背后的原理根据实际场景灵活应用。

相关新闻

计算机视觉深入学习

计算机视觉深入学习

2026/9/27 13:17:35

1. 计算机视觉基础概念 1.1 什么是计算机视觉? 你有没有想过一个问题:为什么我们人类能够轻松地识别出照片中的猫狗、汽车、人物?当我们走进一个房间,眼睛会自动告诉我们这里有什么东西、在哪里、是什么。这种能力对我们来说稀松平常,但对于计算机来说,这可是一个巨大的…

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术

2026/9/8 17:22:10

Boss-Key终极指南:3步掌握Windows老板键一键隐藏技术 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字时代,隐…

C++内存管理深度解析:new/delete与malloc/free的本质区别与应用场景

C++内存管理深度解析:new/delete与malloc/free的本质区别与应用场景

2026/8/23 0:47:57

1. 项目概述:为什么我们需要深入理解 new/delete 与 malloc/free?如果你写过 C 代码,尤其是从 C 语言转过来的,肯定对new、delete、malloc、free这四个词不陌生。表面上看,它们都是用来在堆上申请和释放内存的&#xf…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…