SELECT count( DISTINCT teacher_id ) AS studyNum, tca.course_id as courseIdFROMol_train_course_annex_record AS tcarLEFT JOIN ol_train_course_annex AS tca ON ( tca.`annex_id` = tcar.`annex_id` OR `tca`.`annex_id2` = `tcar`.`annex_id` )WHEREtca.is_deleted = 1AND tca.course_id in(853,762,763,775,773,588,679,677,437,438,480,481,526,527,586)AND tcar.annex_id > 0GROUP BY tca.course_id

explain 分析:
1、扫描了idx_teacher_annex_id 的索引树,效率不高
2、annex_id 60 w+
解决方案:
1、添加 annex_id 索引;
2、左边大表,右边小表,考虑用子查询改造;
方法实现的功能是统计每门课有多少个老师上课,老师上课的标识是存在teacher_id 与 annex_id 的记录,即老师打开课件。
实现步骤:
- 现将被驱动表的tca 中的 courseId 和 annex_id ,annex_id2 查询出来(annex_id 相当于课件)
- 根据annex_id 和 annex_id2 去查询数据库,获取到List
teacherIdList,老师id与课件的打开记录。 - 如果 teahcerIDList 中的annex_id 和 annex_id 或者 annex_id2 匹配,就把teacher_Id 加到Set中
- 最后res.put(course_Id,set.size())
成功实现慢查询子查询拆分
