MySQL / PHP: Programmtuning
Kalle_B
- datenbank
Hallöle,
ich habe eine Liste mit über 600 Besuchern eines Forums. Im Laufe der Zeit wurde diese Liste mit immer neuen Informationen zur Person ergänzt (in Klammern die Zahl der durchschnittlichen Treffer):
1. Welcher Gruppe gehört die Person an? (0 oder 1)
2. Wieviel Gesprächswünsche mit Ausstellern? (10)
3. Wieviel davon gebucht? (8)
4. Wieviel Eventwünsche (Teilnahme an Vorträgen, Diskussionsgruppen)? (5)
5. Wieviel davon gebucht? (5)
Die SQL- Abfrage ergibt also 600*10*8*5*5 Zeilen, die dann auf die 600 Personen verdichtet werden (GROUP BY).
Auf meinem schwächlichen Win-Laptop wurde jetzt dabei die Execution-Time von 60 sec. überschritten, Abbruch nach 570 Zeilen. Ich muss über ein Tuning nachdenken.
Habe jetzt die Zusatzinformationen nur pro Person eingeholt. Das sind zwar 599 Zugriffe mehr auf die Datenbank, aber nur noch
600 + 10*8*5*5 Zeilen (stimmt das?)
Die kommen auf dem Laptop jetzt komplett in 49 sec, auf einem eigenen Debian-Server im Web in 12 sec, beide zusätzlich Übertragung an den Browser.
Irgendwie habe ich das Gefühl, da ist noch mehr drin.
Wer hat sich schon Gedanken zum Tuning gemacht und kann Tipps geben?
Eigentlich ist die Anwendung ein Witz, wenn ich an industrielle Datenmengen denke. Nun gut, die laufen auch nicht auf einem Laptop. Aber wenn hier schon PHP und MySQL an Grenzen stösst ...
Lieben Gruß, Kalle
Eigentlich ist die Anwendung ein Witz, wenn ich an industrielle Datenmengen denke. Nun gut, die laufen auch nicht auf einem Laptop. Aber wenn hier schon PHP und MySQL an Grenzen stösst ...
das klingt eher danch, als ob du deine Tabellen und Abfragen nicht optimiert hast. Viel helfen dabei tut Explain.
Struppi.
Hi,
ja, da sollte noch mehr gehen.
Indexes setzen, welche genau und nur die Felder beinhalten, die abefragt (ausgegeben) werden oder für die Schlüsselbeziehung notwendig sind.
Aber wie sieht z.b die Tabellenstruktur für 4 und 5 aus?
Ausschlaggebend ist auch nicht unbedingt der Durschscnitt von Kombinationen am Ende, sondern bereits vorher. Wenn du aufgrund ungünstig gewählter Strukturen erstmal 2 Mio Datensätze und damit vielleicht 1.5 GB an Datenvolumen generierst, ist das nicht unbedingt optimal. (... dank LEFT oder RIGHT OUTER JOINS)
Musst du denn auch gleichzeitig immer "alles" (1 bis 5) darstellen? Sonst mach doch Views oder Prozeduren, die weniger Daten generieren und spezifisch für eine bestimmte Ansicht sind. 1, 2 und 3 oder 1, 4 und 5 lassen sich gut kombinieren. Wenn dann auch noch 2 und 3 oder 4 und 5 aus der selben Tabelle gezogen werden können, verminderst du sicher das Datenvolumen der Abfrage.
Ciao, Frank