Query optimieren

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

  • Query optimieren

    Hi,

    Folgende SQL-Abfrage dauert ca. 5 Sekunden (bei 250 Inseraten, 6 Job-Inseraten und, 40 Geschichten):

    Code:
    SELECT kats.id,kats.name,kats.bereich,
    		COUNT(DISTINCT inserate.id)AS anz_inserate_aktiv, 
    		COUNT(DISTINCT inserate2.id) AS anz_inserate_alle,
    		COUNT(DISTINCT jobs.id) AS anz_jobs,
    		COUNT(DISTINCT geschichten.id) AS anz_geschichten
    	FROM tab_kats kats
    		LEFT JOIN tab_inserate inserate ON kats.id=inserate.kat AND inserate.aktiv = 1
    		LEFT JOIN tab_inserate inserate2 ON kats.id=inserate2.kat 
    		LEFT JOIN tab_jobs jobs ON kats.id=jobs.kat 
    		LEFT JOIN tab_geschichten geschichten ON kats.id=geschichten.kat 
    	GROUP by kats.bereich,kats.name
    .. was kann man verbessern?

    Gruß,
    Syco
    [COLOR=darkblue].: 1+1=23 :.[/COLOR]

  • #2
    Re: Query optimieren

    EXPLAIN vorsetzen, Ergebnis angucken (oder posten...XD)

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Indizes setzen
      Für alle die Fehler suchen, gibts gratis tolle Debuggingmöglichkeiten:
      var_dump(), print_r(), debug_backtrace und echo.
      Außerdem gibt es für unsere Neueinsteiger ein hervorragendes PHP Tutorial zu PHP 4 und PHP 5 (OOP)
      Es heißt $array['index'] und nicht $array[index]! Und nein, das ist nicht egal!
      Dieses Thema lesen, um Ärger im Forum und verzögerte Hilfen zu vermeiden.

      Kommentar


      • #4
        Aber erst EXPLAIN ... und Ergebnis gucken ... zu viele Indizes sind nämlich bei DML-Statements suboptimal ... !
        carpe noctem

        [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
        [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

        Kommentar


        • #5
          o.k., hab einen screenshot gemacht.
          Angehängte Dateien
          [COLOR=darkblue].: 1+1=23 :.[/COLOR]

          Kommentar


          • #6
            Ich würde für diese Felder jeweils einen Index setzen:

            kats.id
            inserate.kat
            inserate2.kat
            jobs.kat
            geschichten.kat
            kats.bereich

            Gruß Marian
            Online-Kurse die jeder versteht: HTML, PHP, MySQL, Word, Excel
            http://www.lernpilot.de/wbt/

            Kommentar


            • #7
              Original geschrieben von syco23
              o.k., hab einen screenshot gemacht.
              omg, was hast du denn da gemacht?

              (als Ergänzung zu heddesheimer)
              auf kat.id n Primary! (ist das ne Autoincrement-Spalte? Für IDs wird das meißt so gehandhabt...)
              auf die ganzen *.kats normale Indexe
              Was ist kats.bereich? Varchar? Bleibt die Tabelle so klein? Wenn ja keinen Index, ansonsten notgedrungen nen normalen...

              alles machen und dann nochmal EXPLAIN und posten ^^

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                kats.bereich ist int(3).

                kats.id ist primary und auto-increment.

                ich hab jetzt für alle *.kat einen index gesetzt - performance hat sich aber nicht merkbar verbessert.

                Gruß,
                Syco
                Angehängte Dateien
                [COLOR=darkblue].: 1+1=23 :.[/COLOR]

                Kommentar


                • #9
                  Was ich überhaupt nicht verstehe:

                  Ich habe nun in die Tabelle kats das Feld anz_datensaetze eingefügt.

                  Wenn ich nun ein Script für jede Kat die Anzahl an Datensätzen (auch in Unterkategorien) ausrechen lasse habe eine Ladezeit von unter 0.25 Sek.

                  .. und das bei sicher weit über 100 einzelnen Queries mit COUNT() und 99 Kats.
                  [COLOR=darkblue].: 1+1=23 :.[/COLOR]

                  Kommentar

                  Lädt...
                  X