您好,欢迎您访问我们燿动吧 – 知识分享,快乐你我,燿动青春!

燿动吧 – 知识分享,快乐你我,燿动青春

                                          您现在的位置是:燿动吧 > IT技术 >

                                          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表中的数据。

                                          mysql慢查.jpg

                                          望施行野心

                                          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查问。

                                          mysql慢查优化.jpg

                                          附录:

                                          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 ”的作品