Query funktioniert, aber ist sehr unperformant - geht das schneller abzufragen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Query funktioniert, aber ist sehr unperformant - geht das schneller abzufragen?

    Ich hab hier einen MySQL-Query, der auch wunderbar funktioniert, nur leider bei einer Tabelle mit knapp 2 Mio Einträgen ewig lange braucht und die Serverload in unerträgliche Höhen treibt.
    PHP-Code:
    SELECT SQL_BUFFER_RESULT orderidipadresscustomidcustomnamedateline 
    FROM order t1
    ,order t2 
    WHERE t1
    .ipaddress=t2.ipaddress AND t1.customid!=t2.customid 
    AND t2.dateline>(t1.dateline-$szeit) AND t2.dateline<(t1.dateline+$szeit
    AND 
    t1.customid=$customid 
    ORDER BY t1
    .ipaddresst1.dateline 
    Verbal:
    Vorgegeben wird eine Kundennumer [COLOR=darkblue]$customid[/COLOR]. Es soll nun ermittelt und ausgeben werden, ob jemand mit anderer Kundennummer aber identischer IP im Zeitraum +/- [COLOR=darkblue]$szeit[/COLOR] eine Bestellung getätigt hat, d.h. einen Eintrag in der Tabelle 'order' generiert hat.

    Funzt syntaktisch, die Ausgabe ist korrekt, aber es daauuuert ...

    Hab ich da einen Knoten im Hirn gehabt, d.h. lässt sich die Abfrage performanter gestalten?

    Ach ja, läuft auf MySQL 4.1.10a mit PHP 4.3.10

  • #2
    hmm,

    ich würde JOIN verwenden und mal per EXPLAIN versuchen herauszufinden, ob man noch irgenwie index setzen kann.

    wenn du kannst, poste doch mal auszugsweise einen dump der tabelle, dann kan man mal schauen ...
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      schon etwas besser

      Danke für den Tipp. Ist schon etwas performanter.


      So sah die erste Version aus

      PHP-Code:
      SELECT t2.orderidt2.ipaddresst2.customidt2.customnamet2.dateline 
      FROM order 
      AS t1 LEFT JOIN order AS t2 ON t2.ipaddress=t1.ipaddress 
      WHERE t2
      .customid!=t1.customid AND t2.dateline>(t1.dateline-$szeit
      AND 
      t2.dateline<(t1.dateline+$szeit) AND t1.customid=$customid  
      ORDER BY t2
      .customidt2.ipaddresst2.dateline 
      immer noch sehr langsam...

      und so die zweite, die ein winzig bißchen schneller ist

      PHP-Code:
      SELECT t2.orderidt2.ipaddresst2.customidt2.customnamet2.dateline 
      FROM order 
      AS t1 LEFT JOIN order AS t2 ON t1.customid=$customid 
      AND t2.ipaddress=t1.ipaddress 
      WHERE t2
      .customid!=t1.customid AND t2.dateline>(t1.dateline-$szeit
      AND 
      t2.dateline<(t1.dateline+$szeit
      ORDER BY t2.customidt2.ipaddresst2.dateline 
      Die richtigen Ergebnisse liefern beide Versionen

      Beide erzeugen deutlich weniger Last auf dem Server, befriedigend ist das aber aufgrund der langen Scriptlaufzeit immer noch nicht.

      Weitere Indexe in der Tabelle kommen übrigens leider nicht in Frage.

      Gibts an der Abfrage noch etwas zu optimieren?

      Kommentar


      • #4
        WHERE-Condition filtert das Endergebnis, daher kannst du mal versuchen, möglichst viele die Bedingungen in ON einzubauen, dann wird die Datenmenge nicht mehr so groß und es dürfte auch schneller sein (ich habe nicht genau geschaut, was deine Abfrage macht )

        Kommentar

        Lädt...
        X