2016-09-02 5 views
-2

optimieren würde ich fragen, wie kann ich diese Abfrage optimieren:Wie kann ich diese MySQL-Abfrage

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 

Da Abfrage etwa 1,5 dauert - 2 Sekunden. Zum Beispiel, Tabelle statistiky_stridani hat etwa 500 000 Zeilen und statistiky etwa 250 000 Zeilen.

Diese kehrt ERKLÄREN: enter image description here

Danke für Ihre Hilfe

+0

Hm, nein danke - aber viel Glück – Strawberry

Antwort

1
  1. nicht LEFT JOIN statt JOIN Verwenden Sie, wenn Sie wirklich die leeren Zeilen benötigen.

  2. Versuchen Sie eine Neuformulierung, weil JOIN (SELECT ...) JOIN (SELECT ...) schlecht optimiert ist.

  3. Bitte verwenden Sie nicht den gleichen Alias ​​(s) für zwei verschiedene Tabellen; es verwirrt den Leser.

  4. Fügen Sie den zusammengesetzten Index INDEX(rocnik_id, soutez_id) zu souteze hinzu.

  5. LEFT JOIN ... JOIN ... - Bitte fügen Sie Klammern, ob zu zeigen, die JOIN, bevor Sie die LEFT JOIN oder nach sein sollte:

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

Es

entweder

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

oder

Mai
machen einen großen Unterschied in wie der Optimierer die Abfrage durchführt, die kann die Geschwindigkeit ändern.

Möglicherweise gibt es weitere Vorschläge; Arbeite durch diese und frage wieder (wenn es immer noch "zu langsam" ist).

+0

Vereinbaren Sie, dass die abgeleiteten Tabellen auf mysql langsam sind, wenn Sie sie mit indizierten Temp-Tabellen ersetzen müssen, ist es mehr Arbeit vorne, aber zumindest können einige Verbesserungen vorgenommen werden. – Namphibian