Helmuth: MySql 5 - Abfrage dauert ewig. Wie kann ich es beschleunigen?

Hallo, ich brauche drigend Eure Hilfe. Ich habe eine Tabelle, die in etwa so aufgebaut ist und ca. 50.000 Einträge enthält.

id | id_durchgang | id_gruppe | anzahl

1 | 1             | 1         | 50
2 | 1             | 2         | 20
3 | 1             | 3         | 10
4 | 2             | 5         | 30
5 | 2             | 1         | 60
6 | 2             | 7         | 20
7 | 3             | 9         | 30
8 | 3             | 8         | 90
9 | 3             | 1         | 80
...
50.000 ...

Ich will die "anzahl" der "id_gruppe" 1 mit der "anzahl" der "id_gruppe" 2 vergleichen.

SELECT
     q2.anzahl - q1.anzahl AS anzahl_unterschied
FROM tabellle AS q1
     LEFT JOIN tabellle AS q2 ON ( q1.id_gruppe = q2.id_gruppe )
WHERE
     q1.id_durchgang = 1
     AND q2.id_durchgang = 2

Das dauert dauert dann laut "EXPLAIN" im MySql etwa 50.000 x 50.000 Datensätze, also ewig.

Hat jemand ne Idee wie ich es beschleunigen kann? Vielleicht denke ich auch einfach falsch!?

Bin über jede Hilfe dankbar.
Helmuth

  1. SELECT COUNT(*) FROM tabelle WHERE id_Gruppe = 1  
    UNION  
    SELECT COUNT(*) FROM tabelle WHERE id_Gruppe = 2
    

    Sollte dir jeweils die Anzahl Datensätze ausgeben.

    1. Hello,

      SELECT COUNT(*) FROM tabelle WHERE id_Gruppe = 1

      UNION
      SELECT COUNT(*) FROM tabelle WHERE id_Gruppe = 2

      um Ilja zuvorzukommen: hier würde sogar ich einen UNION ALL empfehlen, sonst hast du bei gleicher Zahl nur ein Ergebnis.  
        
      MfG  
      Rouven  
      
      -- 
      \-------------------  
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
        
      Inter Arma Enim Silent Leges  --  Cicero
      
  2. Hallo,

    Hallo, ich brauche drigend Eure Hilfe. Ich habe eine Tabelle, die in etwa so aufgebaut ist und ca. 50.000 Einträge enthält.

    id | id_durchgang | id_gruppe | anzahl

    1 | 1             | 1         | 50
    2 | 1             | 2         | 20
    3 | 1             | 3         | 10
    4 | 2             | 5         | 30
    5 | 2             | 1         | 60
    6 | 2             | 7         | 20
    7 | 3             | 9         | 30
    8 | 3             | 8         | 90
    9 | 3             | 1         | 80
    ...
    50.000 ...

    Ich will die "anzahl" der "id_gruppe" 1 mit der "anzahl" der "id_gruppe" 2 vergleichen.

    Bist Du Dir ganz sicher, dass Du einen LEFT JOIN willst?

    SELECT
         q2.anzahl - q1.anzahl AS anzahl_unterschied
    FROM tabellle AS q1
         LEFT JOIN tabellle AS q2 ON ( q1.id_gruppe = q2.id_gruppe )
    WHERE
         q1.id_durchgang = 1
         AND q2.id_durchgang = 2

    Warum joinst Du nicht die durch Deine WHERE-Klausel eingeschränkten Ergebnismengen miteinander? Selbst wenne es nur 10 Durchgänge gab, wäre dies bereits eine Reduzierung um einen Faktor 100.

    Welche Indexe sind vorhanden, welche können genutzt werden.

    Wieviele Durchgänge gibt es, wieviele Gruppen? Ja, das spielt eine Rolle.

    Das dauert dauert dann laut "EXPLAIN" im MySql etwa 50.000 x 50.000 Datensätze, also ewig.

    Du kennst das Handbuchkapitel Optimization?

    Freundliche Grüße

    Vinzenz