关联查询,mysql子查询优化问题

求大神帮优化下这个sql,这个sql用到导出数据中,这个sql是先查查1600条课程,然后子查询查出该门课程的分数返回,1600条数据全部导出需要快5分钟。主要应该是评价统计主表有evaluation_statistical9万条数据原因,有时导出甚至直接请求超时了,求大神帮优化。
SELECT DISTINCT
j2.KCDM,
j2.KCMC,
j2.JSZGH,
j2.JSXM,( SELECT

( SELECT
sum(e5.level_score)
FROM
evaluation_statistical e4
JOIN evaluation_level e5 ON e4.level_id = e5.level_id
WHERE
e4.bpjr_id=j2.JSZGH and
e4.semester_id = '44a4424321114e7499715d0b1f46ed96'
AND e4.course_id = j2.KCDM
) /
(
SELECT
count(1)
FROM
evaluation_statistical e3
WHERE
e3.bpjr_id=j2.JSZGH and
e3.semester_id ='44a4424321114e7499715d0b1f46ed96'
AND e3.course_id = j2.KCDM
)
) as score
FROM
jw_jskcb j2 WHERE CONCAT(j2.JSZGH,j2.KCDM) IN
(SELECT DISTINCT CONCAT(e.bpjr_id,e.course_id) FROM evaluation_statistical e
WHERE e.isinvalid = '1'
AND e.evaluation_state = '1')

分两步处理,第一步,给evaluation_statistical这表的这个两个字段建立索引e.bpjr_id,e.course_id
第二步,不要是用in这个查询,用left join 或者 exists 代替 ,in是没有使用索引的

把你的DISTINCT去掉,这个是很浪费时间的,其次你的子查询看能不能写在下面

使用explain关键字查看你的sql 再开始优化你的sql 看是否使用了索引

我也曾经遇到子查询严重影响效率的问题,试了很多方法也都只是提示了一半左右的效率,我当时是查工号人员的嵌套关系,订单量大概5000条左右,工号和归属部门分别有200和40多条,但是用了子查询查询订单竟然用时160s左右,你想想request最多60s就会请求超时的。
我也尝试了很多所谓的索引什么的优化,最后的结果就是时间缩短到50-60s左右,还是没有根本解决问题。

子查询带来的效率问题,**最根本的原因就是where后面把子查询作为条件,后果就是每一次的条件判断都会调用子查询,数据结构越复杂,超时越明显**。
我最后的解决办法就是,**先执行子查询,然后将子查询里的结果作为常量放在where条件里**,结果就是原来160s的查询,现在只需要0.1s。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632