Query optimieren

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

  • Query optimieren

    Hallo Leute,

    ich habe ein Problem. Folgendes Query braucht 6 Sekunden bis zur kompletten Ausführung, kann man das irgendwie optimieren?

    PHP-Code:

    SELECT 
    `applicantFirstname`, `applicantSurname`, `jobGroupID`, `jobGroupDate`, `jobGroupStatus`, 
    MAX(`jobGroupHistoryDate`) AS `LastUpdate`, `jobGroupAdditionalTime`, blockVisitTime
    FROM 
    `".PREFIX."jobGroup`
    LEFT JOIN `".PREFIX."blockVisitbv ON (bv.blockVisitUser '".$user["userID"]."' AND bv.blockVisitApp jobGroupID
    LEFT JOIN `".PREFIX."jobGroupHistoryjGH ON ( `jobGroupHistoryGroup` = `jobGroupID` )
    INNER JOIN `".PREFIX."applicantapp ON ( `applicantID` = `jobGroupApplicant` )
    INNER JOIN `".PREFIX."jobFilejF ON ( `jobFileGroup` = `jobGroupID` )
    WHERE `applicantAgency` = '".$agency["agencyID"]."'
    AND (`jobGroupStatus` = '1' OR `jobGroupStatus` = '5'
    AND `
    jobGroupHistoryGroup` = `jobGroupID`
    AND `
    applicantID` = `jobGroupApplicant`
    GROUP BY `jobGroupID`, `jobGroupHistoryGroup`, jF.jobFileGroup 
    ORDER BY 
    `jobGroupStatus`, `jobGroupHistoryDate`, `jobGroupAdditionalTimeDESC 
    Vielen Dank schon jetzt!
    Zuletzt geändert von asp2php; 24.11.2005, 09:45.

  • #2
    1. die Tabellenalias bei Spaltennamen mit angeben damit die DBMS nicht alle Tabellen durchsuchen muss (dafür ist Alias erschaffen), um die richtige Spalten zu finden

    2. versuch mal die Bedingungen, soweit es geht, in ON antatt in WHERE zu integrieren, denn Where filtert erst, wenn das Ergebnis von JOIN vorliegt, dagegen werden die Menge der Daten durch ON schon reduziert.

    Kommentar


    • #3
      Erstmal danke

      Also zum Beispiel aus `applicantFirstname` app.applicantFirstname machen?

      Zu 2.) Ich habe die Daten aus den ONs noch mal in das WHERE hingehauen, also dort entfernen?

      Danke schon jetzt!

      Kommentar


      • #4
        Original geschrieben von Someday
        Erstmal danke

        Also zum Beispiel aus `applicantFirstname` app.applicantFirstname machen?
        ja, wenn die Spalte zu der Tabelle gehört
        Zu 2.) Ich habe die Daten aus den ONs noch mal in das WHERE hingehauen, also dort entfernen?
        lies nochmals, was ich geschrieben habe

        Kommentar


        • #5
          Also, ich habe daraus jetzt folgendes gemacht:

          PHP-Code:

          SELECT app
          .applicantFirstnameapp.applicantSurname, `jobGroupID`, `jobGroupDate`, `jobGroupStatus`, 
          MAX(jGH.jobGroupHistoryDate) AS `LastUpdate`, `jobGroupAdditionalTime`, bv.blockVisitTime
          FROM 
          `".PREFIX."jobGroup`
          LEFT JOIN `".PREFIX."blockVisitbv ON (bv.blockVisitUser '".$user["userID"]."' AND bv.blockVisitApp jobGroupID
          LEFT JOIN `".PREFIX."jobGroupHistoryjGH ON jGH.jobGroupHistoryGroup = `jobGroupID` )
          INNER JOIN `".PREFIX."applicantapp ON app.applicantID = `jobGroupApplicant` )
          INNER JOIN `".PREFIX."jobFilejF ON jF.jobFileGroup = `jobGroupID` )
          WHERE app.applicantAgency '".$agency["agencyID"]."'
          AND (`jobGroupStatus` = '1' OR `jobGroupStatus` = '5'
          AND 
          jGH.jobGroupHistoryGroup = `jobGroupID`
          AND 
          app.applicantID jobGroupApplicant
          GROUP BY jobGroupID
          jGH.jobGroupHistoryGroupjF.jobFileGroup 
          ORDER BY 
          `jobGroupStatus`, jGH.jobGroupHistoryDate, `jobGroupAdditionalTimeDESC 
          Ich verstehe deinen 2. Punkt grad nicht, sry
          Zuletzt geändert von asp2php; 24.11.2005, 09:45.

          Kommentar


          • #6
            du hast im Prinzip nichts geändert, oder nur halbherzig

            was ist denn hieran:

            Original geschrieben von asp2php

            2. versuch mal die Bedingungen, [color=red] soweit es geht[/color], in ON antatt in WHERE zu integrieren, denn Where filtert erst, wenn das Ergebnis von JOIN vorliegt, dagegen werden die Menge der Daten durch ON schon reduziert.
            nicht zu verstehen.

            Achte bitte darauf dass der hor. Scrollbalken nicht mehr auftauchen. ich werde nicht mehr für dich ändern.

            Kommentar


            • #7
              PHP-Code:

              SELECT app
              .applicantFirstnameapp.applicantSurname, `jobGroupID`, `jobGroupDate`, `jobGroupStatus`,
              MAX(jGH.jobGroupHistoryDate) AS `LastUpdate`, `jobGroupAdditionalTime`,
              bv.blockVisitTimeCOUNT(jF.jobFileGroup) AS `CountApps`
              FROM `".PREFIX."jobGroup`
              LEFT JOIN `".PREFIX."blockVisitbv ON (bv.blockVisitUser '".$user["userID"]."' AND bv.blockVisitApp jobGroupID
              LEFT JOIN `".PREFIX."jobGroupHistoryjGH ON jGH.jobGroupHistoryGroup = `jobGroupID` )
              INNER JOIN `".PREFIX."applicantapp ON app.applicantID = `jobGroupApplicant`
              AND 
              app.applicantAgency '".$agency["agencyID"]."' )
              INNER JOIN `".PREFIX."jobFilejF ON jF.jobFileGroup = `jobGroupID` )
              WHERE (`jobGroupStatus` = '1' OR `jobGroupStatus` = '5'
              GROUP BY jobGroupIDjGH.jobGroupHistoryGroupjF.jobFileGroup 
              ORDER BY 
              `jobGroupStatus`, jGH.jobGroupHistoryDate, `jobGroupAdditionalTimeDESC 
              So besser?

              Kommentar


              • #8
                Nein, LESEN

                *Verwarnung*

                Kommentar


                • #9
                  Verdammt,

                  aber ich versteh nicht, wo die Grenze ist, also was ich in die ONs und was in die WHEREs muss/kann...

                  Sorry, aber ixh bitte, mir noch einen Ansatzpunkt zu liefern, evtl. auf Basis meines Quellcodes!

                  Kommentar


                  • #10
                    Wozu brauchst du die Tabelle jobFile, kannst du nicht gleich jobGroupID zählen?
                    Ich denke, also bin ich. - Einige sind trotzdem...

                    Kommentar


                    • #11
                      Um die Anzahl der Einträge aus jobFile, die zur jobGroup gehören, jeweils zu zählen!
                      Aber da liefert er mir immer noch falsche Werte zurück.... Aber das ist ein anderes Problem!
                      Zuletzt geändert von Someday; 24.11.2005, 09:55.

                      Kommentar


                      • #12
                        Schrein ein EXPLAIN vor das SELECTund führe das dann in phpmyadmin aus.
                        Poste das Ergebnis.

                        Hast du entsprechende Indexe gesetzt?

                        Zur Not nehme mal die History-Tabelle raus, ist es dann schneller?
                        Ich denke, also bin ich. - Einige sind trotzdem...

                        Kommentar


                        • #13
                          table type possible_keys key key_len ref rows Extra
                          jGH ALL NULL NULL NULL NULL 3688 Using temporary; Using filesort
                          ij_jobGroup eq_ref PRIMARY PRIMARY 4 jGH.jobGroupHistoryGroup 1 Using where
                          bv ALL NULL NULL NULL NULL 560
                          app eq_ref PRIMARY PRIMARY 4 ij_jobGroup.jobGroupApplicant 1 Using where
                          jF ALL NULL NULL NULL NULL 21924 Using where

                          Wie setze ich Indexe und was bringt das? *Ups :-|*

                          Kommentar


                          • #14
                            Einen Index setzt du, indem du in phpmyadmin bei der entsprechenden Spalte (Tabellenstruktur anzeigen) auf das kleine Tabellensymbol mit dem Blitz klickst.

                            Ein Index sorgt - stark vereinfacht - dafür, dass deine Suche deutlich shcneller werden kann.

                            Setze mal einen Index auf die Spalten, die du im ON, bzw. WHERE verwendest
                            Ich denke, also bin ich. - Einige sind trotzdem...

                            Kommentar


                            • #15
                              Vielen, vielen Dank
                              Das mit den Indexes war DER Tipp!

                              Werde ich ab sofort immer benutzen
                              Gibt es Gründe, warum man an manchen Stellen keine Indexes verwenden sollte?

                              Kommentar

                              Lädt...
                              X