1. SELECT count( DISTINCT teacher_id ) AS studyNum, tca.course_id as courseId
    2. FROM
    3. ol_train_course_annex_record AS tcar
    4. LEFT JOIN ol_train_course_annex AS tca ON ( tca.`annex_id` = tcar.`annex_id` OR `tca`.`annex_id2` = `tcar`.`annex_id` )
    5. WHERE
    6. tca.is_deleted = 1
    7. AND tca.course_id in
    8. (853,762,763,775,773,588,679,677,437,438,480,481,526,527,586)
    9. AND tcar.annex_id > 0
    10. GROUP BY tca.course_id

    image2022-3-16_11-56-50.png
    explain 分析:
    1、扫描了idx_teacher_annex_id 的索引树,效率不高
    2、annex_id 60 w+
    解决方案:
    1、添加 annex_id 索引;
    2、左边大表,右边小表,考虑用子查询改造;

    方法实现的功能是统计每门课有多少个老师上课,老师上课的标识是存在teacher_id 与 annex_id 的记录,即老师打开课件。
    实现步骤:

    1. 现将被驱动表的tca 中的 courseId 和 annex_id ,annex_id2 查询出来(annex_id 相当于课件)
    2. 根据annex_id 和 annex_id2 去查询数据库,获取到List teacherIdList,老师id与课件的打开记录。
    3. 如果 teahcerIDList 中的annex_id 和 annex_id 或者 annex_id2 匹配,就把teacher_Id 加到Set中
    4. 最后res.put(course_Id,set.size())

    成功实现慢查询子查询拆分