Fabienne: Geschwindigkeit und Performance PHP - MySQL

Beitrag lesen

Hallo und guten Abend,

ich arbeite gerade an einem PHP-MySQL-Skript, das ca. 10000 Kundendaten aus mehreren Tabellen zusammenführen soll und in einer CSV ausgeben soll.
Dabei geht es mir Maßgeblich um die gesamte Performance des Skripts (derzeitige Laufzeit ca. 30min!!).

Folgende Tabellen gibt es (exemplarisch):

db.kunden
ID | Kundennummer | Name
Es gibt ca. 10000 Kundendatensätze

db.umsatz
ID | db.kunden.id | Umsatz | Jahr | erstellt_am
Es gibt pro Kunde mehrere Einträge (auch für ein Jahr, z.B. Aktualisierungen)

db.kontakte
ID | db.kunden.id | Name | Vorname | key
key ist ENUM [yes,no] = "Schlüssel-Person", kann nur einen pro Kunde geben

Momentanes Skript (sinngemäß, bitte nicht auf korrekte Schreibweisen achten :-))) ):

// Erstmal alle Kundendatensätze erfragen
SELECT Name FROM db.kunden
while($kundendaten=mysql_fetch_array())
{
  // Umsatz vom letzten Jahr, letzter Eintrag
    SELECT Umsatz FROM db.umsatz WHERE Jahr=2007 AND db.kunden.id=$kundendaten[id] ORDER BY erstellt_am DESC LIMIT 0,1
    $umsatzdaten_vorjahr=mysql_fetch_array();

// Umsatz von diesem Jahr, letzter Eintrag
    SELECT Umsatz FROM db.umsatz WHERE Jahr=2008 AND db.kunden.id=$kundendaten[id] ORDER BY erstellt_am DESC LIMIT 0,1
    $umsatzdaten_dieses_jahr=mysql_fetch_array();

// Hole den Key-Manager
    SELECT Name FROM db.kontakte WHERE db.kunden.id=$kundendaten[id] AND key=yes LIMIT 0,1
    $kundendaten=mysql_fetch_array();

// Daten ausgeben
    print $kundendaten[Name].";".
          $umsatzdaten_vorjahr[Umsatz].";".
          $umsatzdaten_dieses_jahr[Umsatz].";".
          $kontaktdaten[Name];
}

Nun muss bei jedem Kundendatensatz wieder erneut auf die DB zugegriffen werden, was meines Achtens nach die Performance stark schwächt.
Wäre es besser zuerst die ganzen Umsätze in einer Abfrage in ein assoziatives Array einzulesen und dann in der Form $alle_umsaetz[$kundendaten[id]][2007][Umsatz] wieder auszuspucken?
Wenn ja, wie bekomme ich alle diese Umsätze (pro Jahr nur einer, und zwar der zuletzt erstellte) in einer DB-Abfrage unter und anschließend in ein Array?

Könnte ich alles zusammen in einer einzigen "großen" DB-Abfrage vereinen und anschließend ausgeben?

Welche sonstigen Potenziale seht ihr?

Vielen Dank für Eure Antwort!
Fabienne