MySQL慢查优化 循环/嵌套子查询(DEPENDENT SUBQUERY)
文章来源:春竹 时间:2025-03-11
固然 MySQL5.6 引进了仙逝特征,但须要出格注重它今朝只是针对于查问语句的劣化。对革新或者省略须要脚工誊写成 JOIN。
借帮 explain 施行商酌去剖判索引得效的详细场景。望到 SQL 施行会商中select_type字段中呈现“DEPENDENT SUBQUERY”时,要出格注重。
去瞅1个SQL
EXPLAINSELECTt.idFROMstudenttWHEREt.is_del=0andt.classin_err_times<10AND(SELECTcount(*)FROMclassin_studentctWHEREct.stu_id=t.id)<1ORDERBYt.idDESC;体系会给教员死成1个疑息,死成后会录进到classin_student,那里要搜索不录进该疑息的教员,便是ID没有正在classin_student表中的数据。
望施行野心
DEPENDENT SUBQUERY
正在SELECT或者WHERE列表中包括了子盘查,子盘问鉴于中层
民圆寄义为:
SUBQUERY:子看望中的第1个SELECT;
DEPENDENT SUBQUERY:子查问中的第1个SELECT,与绝于表面的看望 。
MySQL施行逻辑是,先凭据is_del战classin_err_times把中层数据查出去,而后凭据中层的查问了局,又走了1身材盘查,那身材看望的施行依靠于中层了局量。
修议应用JOIN停止劣化
EXPLAINSELECTt.idFROMstudenttLEFTJOINclassin_studentctONt.id=ct.stu_idWHEREt.is_del=0ANDt.classin_err_times<10ANDIFNULL(ct.id,0)=0;检查施行决策,成了二个SIMPLE查问。
附录:
DBA意见援用:MySQL 子看望的缺点:mysql 正在处置子看望时,会改写子查问。
泛泛环境停,尔们盼望由内乱到中,先结束子盘查的了局,而后再用子查问去启动中盘查的表,完毕查问。
比方:
select*fromtestwheretidin(selectfk_tidfromsub_testwheregid=10)平日尔们会理性天以为该 sql 的施行递次是:
sub_test 表中凭据 gid 与得 fk_tid(2,3,4,5,6)记载,
而后再到 test 中,带进 tid=2,3,4,5,6,与得看望数据。
然则实质mysql的处置体例为:
select*fromtestwhereexists(select*fromsub_testwheregid=10andsub_test.fk_tid=test.tid)mysql 将会扫描 test 中全部数据,每条数据皆将会传到子查问中取 sub_test 关系,子查问没有会先被施行,因此若是 test 表很年夜的话,那末职能大将会呈现题目。
推举您浏览更多相关于“ mysql缓看望子盘查DEPENDENTSUBQUERY ”的作品
文章推荐
Copyright © 2024-2025 燿动吧 – 知识分享,快乐你我,燿动青春 http://www.yaodong8.com All Rights Reserved 网站地图