2016-09-02 94 views
-2

我想問一下,我該怎麼優化這個查詢:如何優化此MySQL查詢

select 
    h.jmeno hrac, 
    n1.url hrac_url, 
    t.nazev tym, 
    n2.url tym_url, 
    ss.pocet_zapasu zapasy, 
    ss.pocet_minut minuty, 
    s.celkem_golu goly, 
    s.zk, 
    s.ck 
from 
    hraci h 
left join 
    (
     select 
      hrac_id, 
      tym_id, 
      count(minut_celkem) pocet_zapasu, 
      sum(minut_celkem) pocet_minut 
     from 
      statistiky_stridani ss 
     join 
      zapasy z 
       on z.id = ss.zapas_id 
     join 
      souteze s 
       on s.id = z.soutez_id 
     join 
      souteze_nazev sn 
       on sn.id = s.soutez_id 
     where 
      s.rocnik_id = 2 
     group by 
      hrac_id 
    ) ss on ss.hrac_id = h.id 
left join 
    (
     select 
      hrac_id, 
      tym_id, 
      sum(typ_id = 1 or typ_id = 3) as celkem_golu, 
      sum(typ_id = 4) as zk, 
      sum(typ_id = 5) as ck 
     from 
      statistiky st 
     join 
      zapasy z 
       on z.id = st.zapas_id 
     join 
      souteze s 
       on s.id = z.soutez_id 
     join 
      souteze_nazev sn 
       on sn.id = s.soutez_id 
     where 
      s.rocnik_id = 2 
     group by 
      hrac_id 
    ) s on s.hrac_id = h.id 
join 
    navigace n1 
     on n1.id = h.nav_id 
join 
    tymy t 
     on t.id = ss.tym_id 
join 
    navigace n2 
     on n2.id = t.nav_id 
order by 
    s.celkem_golu desc 
limit 
    10 

因爲查詢需要大約1.5 - 2秒。例如,table statistiky_stridani有大約500 000行,statistiky大約有250 000行。

這將返回講解: enter image description here

謝謝您的幫助

+0

嗯,不,謝謝 - 但祝你好運 – Strawberry

回答

1
  1. 不要使用LEFT JOIN而不是JOIN除非你真的需要的空行。

  2. 嘗試重新制定因爲JOIN (SELECT ...) JOIN (SELECT ...)優化不佳。

  3. 請不要爲兩個不同的表使用相同的別名(s)它迷惑了讀者。

  4. 將複合索引INDEX(rocnik_id, soutez_id)加到souteze

  5. LEFT JOIN ... JOIN ... - 請加括號顯示JOIN是否應該做LEFT JOIN之前或之後:

要麼

FROM ... 
LEFT JOIN (... JOIN ...) 

FROM (... LEFT JOIN ...) 
JOIN ... 

可能是在優化程序執行查詢的方式上有很大不同,其中可能會更改速度。

可能有更多的建議;通過這些工作並再次詢問(如果它仍然「太慢」)。

+0

如果你需要這樣做,同意派生的表對MySQL的速度很慢,用索引臨時表替換它們,但是它的更多工作可以做到,但至少可以做一些改進。 – Namphibian