《MySQLjoin的自动优化》由会员分享,可在线阅读,更多相关《MySQLjoin的自动优化(9页珍藏版)》请在金锄头文库上搜索。
1、QLjoi的自动优化MySL的多表Join查询是会自动优化顺序的,本文将以一个实例讲述。1、首先,编写一个建表脚本eail160;protectd* * tet$ i catA.setet;DROP PRCDUREIF XISTS Pcrat;dp able i exiss;drop table ifexistsB;dr abeiexists C;create able (dnt() rmary key,ttl varcha(1),ontentvarchar(1),uint(1),tid int(11);cettableB(ud it()priar key,unamevarchr(16));c
2、rattal C(tid it() primaryey,tna varch(16),ae int(11));ELMITER /CREATErocedPcreate()# 创建无参存储过程BINDECLAREi INT default 0;WHEilt;4000 D 结束循环的条件: 当i大于n时跳出wie循环ISERT IO VALUES(i,cona(title,i),#;ntent#3;,i400,%100); # 往表添数据ST = i+1; #循环一次,i加1NWLE; #结束whle循环SELCT cont(*) RM ; 查看表数据set i=0;WHLE l;8000 结束循环的
3、条件: 当i大于n时跳出whle循环INSR ITO LUES(,oncat(#39;unam#39;,i); #往表添数据ET i = ; # 循环一次,i加EN WHL; #结束hil循环SEE cnt(*) FOM B; 查看表数据seti0;WHLE t;20 DO 结束循环的条件: 当i大于n时跳出whi循环SERT ITC VALUES(i,conat(9;tname#39;,i),i1); # 往表添数据STi= i+; # 循环一次,i加1ED WHE; # 结束while循环SLC cun()ROMC; 查看表数据E;/ 结束定义语句DELMIER ;# 重新将分隔符设置为;
4、ALL eat(); # 调用存储过程2、编写查询脚本ail#160;poteed/* */ tes vi sletjoin.sqse tst;explain lectoun() frm(SLECT .aid,A.tle, .nam,C.tname,Ca FR ALEFT OIN NA.ud=B.id lt JON C ON AtiC.ti whrC.aget;1) A;explain selec cnt(*) frm(slect AC.ad, C.title from (SELECT Aai, .ile, .uid, .nme, C.gFOM A LEFTOI AtC.ti whereC.a
5、lt;1)AC LEFT JOIN ON AC.ud=B.uid) B;、依次执行脚本看结果myql source/homerots/createA.sql略(1)去掉slectjoin.sq中的explain,执行Databas hnge+-+| con(*) |-+| 40 |+-+ row i st(008 se)+-+| cout(*) |+-+| 400 +-+1 ow in et (.08 se)发现两者居然时间相同,难道不应该第二个提前剪枝的更优么??。()执行explai查看执行计划ysql surce /home/otest/seectjoin.sqlReaing tabe
6、inoratior compleion of table andcolumn nasYou canur of th fetureto ga quk stu ith ADtabase change+-+-+-+-+-+-+-+-+-+-+-+| d | le_te |tle | parttins tpe possblekeys key ky_n | f | rws filteed |Exr -+-+-+-+-+-+-+-+-+-+-+| 1 SIMPE | | NL |AL | NU | NULL |NULL |NL 30 | 1000 | NLL | SMPL | C | ULL | eq_r
7、f | PRIMAY |PRIMAY | 4 | ts.A.id | 1| 3.33 | sng hee |1 SIML | B ULL | q_ref |PRA | PRIY | | test.Auid | 1 10.| singidx |+-+-+-+-+-+-+-+-+-+-+ rwin s, 1 warning (0.0 e)-+-+-+-+-+-+-+-+-+-| id| secttype | able | partion |y | possibeys | key |elen | rf | rows | filteed| xtra |+-+-+-+-+-+-+-+-+-+ | IMP
8、E | NUL | AL |NULL NUL | NULL |NUL |333| 00.00 NL | | SIM | C ULL | e_|RMARY PRIMR 4 s.ti | 1 33.33|Usg whee | | SIPL | |NUL eq_re | PRMARY | RIMARY | tet.Auid | 1| 100. | snind |+-+-+-+-+-+-+-+-3 rosnset, 1wrin (0.0sec)发现两者执行计划相同。4、结果分析MyQL执行语句过程中涉及到两大流程:优化器和执行器。其中优化器最主要的任务,是选择索引和在多表连接时选择连接顺序。join顺
9、序的选择会影响执行性能,确定in执行顺序就需要估算所有joi操作的代价。默认配置下MyL会估算所有可能的组合,由于MyQ里限制一个查询的oin表数目上限为1,所以MySQL有一个参数叫做optimizer_searchdeph,默认为62,限制优化器的深度。加入有20张表jn查询,如otimizer_serch_epth为4,则评估次数为20*191817。mysqshowariabeslike #39;%optiize_search_dep%3;;+-| Vaablenme | alu -+-+ optimzerseacdpth | 62 |+-+在本例中,MyQL优化器执行了优化,所以两者都选取了最优的顺序。1