MYSQL子查询优化.docx
《MYSQL子查询优化.docx》由会员分享,可在线阅读,更多相关《MYSQL子查询优化.docx(5页珍藏版)》请在第一文库网上搜索。
1、子查询优化子查询转换为连接子查询优化是MySQL DBA必备的一个技能,原因如下: MySQL对子查询的处理并不是很好,不能像Oracle一样可以改写子查询。基于代价的查询优化器并不完善(在MySQL5.7版本之后逐渐加强)。本章我们讲解几个子查询优化案例,让大家加深对子查询的印象。案例中所使用的表及数据可以从hHps:/问题现象每日夜间对客户系统做备份时总是不成功,并导致整个系统不能正常运行,排查后发现是由于该备份操作与一条查询SQL语句发生了冲突。关于备份为何会与查询SQL语句冲突这里不做过多解释,我们主要分析整条SQL语句为何执行过慢。SQL语句结构如下:select count(*)
2、from enloyees as a where exists (select en_no from dept_emp b wherea.emp no = b. emp no and b. dept_no = 1 d007 ,);这是一个很简单的子查询,但是在早期的MySQL版本(客户使用的是5.5版本)中对子查询的处理并不是先执行子查询,然后再与外表进行关联的,而是遍历employees (a)表中的每一条记录,代入到子查询中。这条查询语句的执行计划如图381所示。| 1d | select.type| type | posslble.keys | koy | key.ln | ref| r
3、ows | Ero|1 | PRIMARY| a| Index | NULL| PRIMARY | 4| HULL|299512 | Using where; Using index |2 I DEPENDENTSU8QUERY | b| eq.ref | PRIMARYno | PRIMARY | 8| employee*.a.eop.no.const|1 | Using where; UK” index |图38-1从执行计划(关于执行计划详解,请参考本书下载资源中的“附录D”)上看,先执行的是b表,但是b表的selecjtype是“DEPENDENT SUBQUERY”,表示这个子查询依
4、赖于外表查询,而不是先执行子香询。在MySQL早期版本中,对于in的操作子查询是不能展开的,但是在新版本中做了一些优化,可以将子查询展开。例如,下面的SQL语句的执行计划如图38-2所示。mysql explain extended select count(*) from enloyees as a where en5_no in (select emp_nofrom dept enp b where b. enp no = a. enp no and b. dept no = fd0071);,I.图38-2在执行计划中,我们通过explain extended查看到语句已经被转换为连接,
5、此时的执行计划是先执行b表,然后再与a表做关联查询。优化方案在MySQL的有些版本中,如果不能将子查询展开,则可以将SQL语句改写为关联查询的形式,如下所示。select count(*) from employees as a, (select distinct en)_no from dept_en5) where dept_no=*d007,)b where a.&mp_no = b.emp_no;改写为关联查询后,能达到的优化效果和子查询展开效果一样(这里的distinct是为了去重,如果emp_no存在重复的数据,则执行结果集不对。其实这里不用使用distinct,因为dept_no
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MYSQL 查询 优化