
1) 【一句话结论】:查询“某课程平均分”性能差的核心原因是 student_scores 表针对聚合查询(按课程ID计算平均分)缺乏有效索引,导致数据库全表扫描或索引失效,优化可通过为课程ID字段添加合适的索引(如复合索引或覆盖索引)来提升查询效率。
2) 【原理/概念讲解】:数据库查询优化中,索引是加速数据检索的关键工具,特别是 B 树索引,通过构建键值与数据行的映射,能快速定位满足条件的行。对于聚合查询(如计算平均分),若索引字段未包含聚合的分组列(课程ID),数据库可能需要扫描整个表或索引,再执行聚合操作,导致性能下降。类比:图书馆找某一课程的书籍,若目录(索引)只按学生ID排序,而实际要按课程找,需要翻遍所有目录页,效率低;若目录按课程ID排序,可直接定位到该课程的所有记录,快速计算平均分。
3) 【对比与适用场景】:对比不同索引策略在聚合查询中的效果,表格如下:
| 索引类型 | 定义 | 特性 | 使用场景(聚合查询) | 注意点 |
|---|---|---|---|---|
| 单列索引(课程ID) | 仅对课程ID字段建立索引 | 仅加速按课程ID的等值查询 | 适用于查询时仅过滤课程ID | 聚合时需扫描索引后回表,若数据量大可能慢 |
| 复合索引(课程ID, 成绩) | 同时包含课程ID和成绩字段 | 加速按课程ID分组并聚合 | 适用于需按课程ID分组计算平均分 | 索引列顺序影响效率,应将分组列放在前 |
| 覆盖索引(课程ID, 成绩) | 索引包含聚合所需的所有列 | 无需回表,直接从索引取值 | 适用于查询仅需要课程ID和成绩 | 索引列顺序需包含所有查询列 |
4) 【示例】:假设 student_scores 表结构为:学生ID int, 课程ID int, 成绩 decimal(3,2), 提交时间 datetime。原查询:SELECT AVG(成绩) FROM student_scores WHERE 课程ID = 101;。分析:若表无课程ID索引,数据库需扫描所有行,计算平均分,性能差。优化后添加复合索引:CREATE INDEX idx_course_score ON student_scores(课程ID, 成绩);。优化后查询通过索引快速定位课程101的所有记录,计算平均分,避免全表扫描。
5) 【面试口播版答案】:面试官您好,关于“某课程平均分”查询性能差的问题,核心原因是 student_scores 表针对聚合查询(按课程ID计算平均分)缺乏有效索引。具体来说,数据库在执行聚合操作时,若索引未包含聚合的分组列(课程ID),会进行全表扫描或索引失效,导致查询效率低。优化方案是给课程ID字段添加合适的索引,比如复合索引(课程ID, 成绩),这样查询时能通过索引快速定位该课程的所有记录,直接计算平均分,避免全表扫描。例如,添加索引后,查询语句会利用索引的有序性,快速过滤出课程101的行,再计算成绩的平均值,性能显著提升。
6) 【追问清单】:
7) 【常见坑/雷区】: