能否用JOIN替代SQL子查询,提升代课通知关联查询性能?
优化多对多关联的代课通知查询
当然可以!用JOIN重写这个查询不仅能解决子查询的性能问题,逻辑上也更直观,尤其适合数据量较大的场景。
原查询的性能问题
你的原查询用了IN子查询,虽然功能正常,但当students_volunteers表数据量增长时,数据库可能会对每个外层查询的记录重复执行子查询,导致效率下降。JOIN的方式通常能让数据库更好地利用索引,执行计划也更高效。
优化后的JOIN版本
下面是用自JOIN实现的等价查询:
SELECT DISTINCT sv2.v_id_sv AS teacher_id FROM students_volunteers sv1 JOIN students_volunteers sv2 ON sv1.s_id_sv = sv2.s_id_sv WHERE sv1.v_id_sv = 3 AND sv2.v_id_sv <> 3;
逻辑解释
- 用别名
sv1的表筛选出ID为3的教师所带的所有学生的关联记录 - 通过学生ID(
s_id_sv)关联别名sv2的同一张表,找到教这些学生的所有其他教师 DISTINCT关键字确保每个教师只返回一次,避免因为同一个学生被多个教师带而产生重复通知
进一步优化:关联教师表获取完整信息
如果后续需要直接给教师发通知,还可以关联teachers表直接拿到教师姓名,省去额外查询:
SELECT DISTINCT t.teacher_id, t.teacher_name FROM students_volunteers sv1 JOIN students_volunteers sv2 ON sv1.s_id_sv = sv2.s_id_sv JOIN teachers t ON sv2.v_id_sv = t.teacher_id WHERE sv1.v_id_sv = 3 AND sv2.v_id_sv <> 3;
索引建议
为了让这个查询跑得更快,一定要给students_volunteers表建立联合索引:
CREATE INDEX idx_sv_teacher_student ON students_volunteers(v_id_sv, s_id_sv);
这个索引会同时加速WHERE sv1.v_id_sv = 3的筛选,以及两张表之间的JOIN操作。
内容的提问来源于stack exchange,提问作者asdfasdfasdf
相关产品推荐
相关产品推荐

