Abfrage über 3 Tabellen muss beschleunigt werden

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

  • Abfrage über 3 Tabellen muss beschleunigt werden

    Hallo!
    Nach relativ langer Zeit melde ich mich mal wieder mit einem Problem zu Wort, und hoffe auf Eure Hilfe

    Erstmal die Vorgeschichte:
    Ich will ein (Perl-) Script optimieren, welches von einem ehemaligen Mitarbeiter programmiert wurde, und hauptsächlich eine Autoersatzteil-SQL-Datenbank mit momentan 32000 Datensätzen durchforstet, deren Struktur ebenfalls von diesem Mitarbeiter entworfen wurde. Muss mandazu sagen, nicht daß ich deswegen gleich geflamed werde

    Es bremst jedenfalls mittlerweile bei jedem Aufruf unseren Webserver aus, also ist da Not am Mann.

    Massive Performanceprobleme gibts schon auf der Startseite, wo "nur" die Autohersteller als weiterführende Links ausgegeben werden.

    Die Ermittlung erfolgt über 3 Tabellen (unwichtiges weggekürzt):
    Code:
    lager
    -Bestellnummer, int(10), PK
    -FzgNr, varchar(50), FK -> fztyp
    
    fztyp
    -FTypNr, int(8)
    -HerstNr, int(5), FK -> hersteller
    
    hersteller
    -herstellernummer, int(5), PK
    -herstellerbezeichnung, varchar(50)
    Der Vollständigkeit halber noch die Abfragen, die das Perl-Script momentan benutzt, um eine Liste der vorhandenen Hersteller zu ermitteln:

    Code:
    SELECT DISTINCT(FzgNr), Untertyp FROM lager
    
    foreach ... {
      SELECT DISTINCT HerstNr FROM fztyp WHERE FTypNr = '$lagerfztyp'
    
      foreach ... {
        SELECT DISTINCT * FROM hersteller WHERE herstellernummer IN ($herstellernummern) 
        ORDER by herstellerbezeichnung
    
      }
    }
    Macht knapp über 750 Abfragen, nur um 32 Hersteller zu ermitteln

    Ein bereits geplanter Arbeitsschritt wird nun sein, die Herstellertabelle beim Datenbankupdate (bei dem immer die kompletten Daten erneut eingeschrieben werden) zu leeren, und nur die zu erfassen, von denen es Ersatzteile gibt. So brauch der ganze Prassel nur 1x gemacht werden, und es reicht ein einfaches SELECT für die Hersteller-Darstellung auf der Startseite (incl. Anzahl der jeweiligen Ersatzteile usw.).

    Jetzt mag der eine oder andere denken: "Damit hast du doch dein Problem schon selbst gelöst, Lodi."

    Eigentlich ja, aber mich würde schon interessieren: geht es auch anders, selbst wenn beschriebene Variante die wohl beste Lösung ist?
    Grade in Sachen MySQL und Performance sind bei mir noch einige Wissenslücken zu stopfen, deswegen täten mich Möglichkeiten einer reinen SQL-Optimierung schon sehr interessieren.

    Ich habe mich jetzt 3 Stunden lang mit JOIN beschäftigt, hier im Forum gesucht, diverse Sachen ausprobiert (mrhappiness' Thread zum Thema ist klasse), allerdings bekomme ich meine Abfrage nicht hin.

    Mein letzter Versuch auf meinem lokalen Rechner war:
    Code:
    SELECT t1.herstellerbezeichnung, t2.HerstNr, t3.FzgNr
    FROM fztyp t2
    RIGHT JOIN hersteller t1 ON t2.HerstNr=t1.herstellernummer
    LEFT JOIN lager t3 ON t2.FTypNr=t3.FzgNr
    Erzeugte allerdings selbst bei nur 1000 Datensätzen ne riesige Prozesslast und es tat sich fast nix mehr, musste MySQL dann abschiessen
    Hängt wohl damit zusammen, daß ich die ganze JOIN-Geschichte einfach nicht kapiere. Aber ich habs versucht, ehrlich *g*

    Vielleicht hat jemand eine Idee?
    Danke schon mal, fürs Lesen dieses halben Romans hier.

    Lodi
    Zuletzt geändert von Lodi; 24.10.2005, 11:15.
    "...vielleicht stehe ich vor dir und du erkennst mich nicht. Spielt das eine Rolle? Wir sah'n ins gleiche Licht..."

  • #2
    ich habs nicht gelesen

    aber: wenn keine notwendigkeit zu right/left join (NULL bei nicht-existenz eines 'partners') besteht, nimm nur join. verwende außerdem explain und setz indexe.
    Die Zeit hat ihre Kinder längst gefressen

    Kommentar


    • #3
      Danke für deine Antwort, derHund, auch wenn du's nicht gelesen hast
      Leider bringt mich das nicht auf die richtige Spur.

      Muss aber dazu sagen, daß ich bereits auf die von mir angesprochene Lösung mit der Herstellertabelle ausgewichen bin...et voilà, das ganze Script (incl. sämtlicher Unterseiten wie Suche, Detailansicht usw.) flitzt regelrecht über den Bildschirm

      Erwähnte 750 Abfragen, nur um die vorhandenen Hersteller zu ermitteln, wurden nämlich in einer Funktion ausgeführt...welche bei JEDEM Scriptaufruf aufgerufen wurde
      "...vielleicht stehe ich vor dir und du erkennst mich nicht. Spielt das eine Rolle? Wir sah'n ins gleiche Licht..."

      Kommentar

      Lädt...
      X