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):
Der Vollständigkeit halber noch die Abfragen, die das Perl-Script momentan benutzt, um eine Liste der vorhandenen Hersteller zu ermitteln:
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:
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
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)
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 } }
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
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
Kommentar