mysql - Slow query with lot of joins and 'IN' statement -


i have slow query , believe due 'in' statement. list of ids in 'in' statement can large, 250+. query run 2+ seconds every time, , slow.

is there way speed up?

select u.achternaam achternaam, u.code code, srt.niveaus niveaus, srt.soortid soortid,ifnull( scr.gehaald,'0')as gehaald, ifnull( scr.gespeeld,'0')as gespeeld, if( srt.niveaus =1,'n.v.t.', ifnull(scr.huidigniveau,'0') )as niveautext  gebruikers u  left join ( select scoreid,schoolcode, soortid, userid, gehaald, gespeeld, huidigniveau              scores) scr on scr.userid = u.code               left join ( select soortid,niveaus,spelid,titel,verberg              soorten              soortid in (13,14,15,16,17,561,566,567,568,574,575,1,100,101,102,103,104,105,107,108,109,11,110,112,113,114,115,116,117,118,12,120,121,122,123,124,125,126,127,128,129,130,131,133,134,137,138,140,141,144,145)) srt on scr.soortid = srt.soortid left join(select spelnaam,spelid,vakid spellen) g on srt.spelid=g.spelid left join(select vakid,vaknaam vakken) vak on g.vakid=vak.vakid u.groepsid='28' , u.schoolcode ='1'  , srt.verberg =0 order achternaam,vak.vaknaam,g.spelnaam,srt.titel asc 

result of explain select:

explain

don't use subqueries, join tables directly.

note srt.verberg = 0 test should in on clause, not where clause. when use left join, conditions on second table should in on, unless you're testing null results not finding match.

select u.achternaam achternaam, u.code code, srt.niveaus niveaus, srt.soortid soortid,ifnull( scr.gehaald,'0')as gehaald, ifnull( scr.gespeeld,'0')as gespeeld, if( srt.niveaus =1,'n.v.t.', ifnull(scr.huidigniveau,'0') )as niveautext  gebruikers u  left join scores scr on scr.userid = u.code               left join soorten srt on scr.soortid = srt.soortid     , srt.soortid in (13,14,15,16,17,561,566,567,568,574,575,1,100,101,102,103,104,105,107,108,109,11,110,112,113,114,115,116,117,118,12,120,121,122,123,124,125,126,127,128,129,130,131,133,134,137,138,140,141,144,145)     , srt.verberg = 0 left join spellen g on srt.spelid=g.spelid left join vakken vak on g.vakid=vak.vakid u.groepsid='28' , u.schoolcode ='1' order achternaam, vak.vaknaam, g.spelnaam, srt.titel asc 

also, make sure need use left join rather inner join. left join should used when want result include rows first table have no matches in second table. inner join performance better, should use whenever appropriate.


Comments

Popular posts from this blog

asp.net mvc - SSO between MVCForum and Umbraco7 -

Python Tkinter keyboard using bind -

ubuntu - Selenium Node Not Connecting to Hub, Not Opening Port -