Fabienne: Geschwindigkeit und Performance PHP - MySQL II

Beitrag lesen

Hallo zusammen,

leider ist meinOriginal-Posting schon im Archiv.

Ich habe jetzt folgendes programmiert und getestet:

Folgende DBs gibt es:

customers:
id | name | ....
1  | Kohl | .....
2  | Müller | .....
3  | irgendwer | ....

kontakte:
id | customers_id | name | ansprechpartner_tourenplan
1  |       1      | Ich  | nein
2  |       1      | Du   | ja
3  |       2      | Toll | ja

turnover: (was: Welche Umsatz: _des_ Kunden oder _mit_ dem Kunde) id | customers_id | jahr | erstellt_am | wert | was
1  |      1       | 2007 | 2007-12-29  | 2890 | mit
2  |      1       | 2007 | 2007-12-30  | 3120 | mit
3  |      2       | 2008 | 2008-01-20  | 450  | mit
4  |      2       | 2008 | 2008-01-20  | 192020  | des

ZIEL:
alle Kundeninfos + der _eine_ Ansprechpartner für den Tourenplan, falls vorhanden + die Umsätze _mit_ dem Kunden, jeweils nur der letzte Eintrag, falls vorhanden ==> Ausgabe kommt später in eine CSV-Datei rein. Dort soll pro Zeile nur ein Kunde stehen mit den Ansprechpartnern und dem Umsatz.

Meine Lösung:

$anfrage="
SELECT
    customers.id,
    customers.*,
    kontakte.id,
    kontakte.*
FROM
    customers

-- Kontakte, die Ansprechpartner fuer Tourenplan sind (und zwar nur einer, falls mehrere vorhanden wären)
LEFT JOIN
  (
    SELECT k.* FROM customercontacts k WHERE k.ansprechpartner_tourenplan='ja' LIMIT 0,1
  ) kontakte
ON customers.id = kontakte.customer_id

-- Umsatz _mit_ Kunde aus Vorjahr, letzter Eintrag, nur ein Eintrag, falls mehrere vorhanden
LEFT JOIN
  (
    SELECT u.* FROM turnover u
          WHERE
              u.erstellt_am = (
                              SELECT MAX(um.erstellt_am) FROM turnover um
                              WHERE um.customer_id = u.customer_id
                                       AND um.jahr='2007' AND um.was='mit'
                              )
              AND u.was='mit'

) umsatz_vorjahr
ON customers.id = umsatz_vorjahr.customers_id

-- einfach mal etwas eingeschränkt, dass nicht gleich alle Datensätze rauskommen....
WHERE customers.id<20 LIMIT 0,5

";

Ergebnis:
MySQL-Server hat sich aufgehängt, CPU 100% Last!
Habe ich da irgendwo einen Zirkelbezug drin (Schleife??)?

Frage zu JOINs allgemein:
Ich bild zunächst eine Anfrage, die die bestehdnen Datensätze einschränkt (also eine Quasi-Neue-Tabelle suggeriert mit weniger Datensätzen), wobei die WHERE-Klausel erst ganz am Schluss ausgeführt wird (Tabelle wird also komplett in RAM geladen). Danach kann ich über JOINs beliebige andere Tabellen an die zuerst genannte Auswahl dranhängen (Korrelation über die Beziehung "ON erste.id=zweite.id").
Habe ich das mit den JOINs richtig verstanden?

Was ist bei JOINs mit Sub-Selects? Welche WHEREs darf ich da verwenden? Kann ich auf die Daten des Haupt-Selects überhaupt zugreifen oder macht genau das mir meinen Zirkelbezug = Endlosschleife?

Die Ergebnisse werden ja in einem Array geliefert.
Die id ist ja mehrfach vergeben. Wie komme ich an die einzelnen IDs?
Nur über z.B. $array[71] anstelle $array[id]?
Bei den einzeln definierten Vars geht das ja einfacher: $array[ansprechpartner_tourenplan]....
Gibt es da noch ne andere Möglichkeit außer der umständlichen Methode "... AS neuer_name"?

Vielen Dank für Eure Antworten!
Fabienne