wie zu optimieren, eine left join-Abfrage?
Ich habe zwei Tabellen, jos_eimcart_customers_addresses und jos_eimcart_customers. Ich will ziehen Sie alle Datensätze aus der Tabelle Kunden, und umfassen-Adresse, soweit verfügbar, Angaben aus der Tabelle "Adressen". Die Abfrage funktioniert, aber auf meinem localhost Rechner dauerte es über eine minute um zu starten. Auf localhost, die Tabellen sind über 8000 Zeilen jeder, aber in der Produktion könnte die Tabellen sind nach oben von 25.000 Zeilen jeweils. Gibt es eine Möglichkeit, um dies zu optimieren, damit es nicht so lange dauern? Beide Tabellen haben einen index auf das Feld id, die Primärschlüssel. Gibt es eine andere index brauche ich, um zu erstellen, dass würde helfen, dies schneller zu laufen? Sollten die Adressen-Tabelle über einen index auf die customer_id Feld, da es ein Fremdschlüssel? Ich habe andere Datenbank Abfragen, die ähnlich sind, und führen Sie auf viel größere Tabellen, mehr schnell.
(BEARBEITET, UM HINZUFÜGEN: Es kann mehr als eine Adresse Datensatz pro Kunde, so customer_id ist nicht ein eindeutiger Wert in der Tabelle "Adressen".)
select
c.firstname,
c.lastname,
c.email as customer_email,
a.email as address_email,
c.phone as customer_phone,
a.phone as address_phone,
a.company,
a.address1,
a.address2,
a.city,
a.state,a.zip,
c.last_signin
from jos_eimcart_customers c
left join jos_eimcart_customers_addresses a
on c.id = a.customer_id
order by c.last_signin desc
BEARBEITET, UM HINZUFÜGEN: Erklären Sie die Ergebnisse
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
==========================================================================================
1 | SIMPLE | c | ALL | NULL | NULL| NULL |NULL |6175 |Using temporary; Using filesort
---------------------------------------------------------------------------------------
1 | SIMPLE | a | ALL | NULL | NULL| NULL |NULL |8111 |
InformationsquelleAutor EmmyS | 2010-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie einen index erstellen, der auf einem.customer_id. Es muss nicht ein eindeutiger index, aber es sollte auf jeden Fall indiziert werden.
Versuchen Sie, erstellen ein index und sehen, ob es schneller ist. Zur weiteren Optimierung können Sie mit der SQL -
EXPLAIN
um zu sehen, wenn Sie Ihre Abfrage unter Verwendung von Indizes, wo es sein sollte.Versuchen http://www.dbtuna.com/article.asp?id=14 und http://www.devshed.com/c/a/MySQL/MySQL-Optimization-part-1/2/ für ein bisschen info auf ERKLÄREN.
Zur info, ich bin der Annahme, dass diese Antwort über darren ' s nur da kam es in 2 Minuten früher - die haben beide im Grunde die gleiche Antwort, es gibt also keinen anderen Weg, um zu entscheiden, wer gewinnt!
InformationsquelleAutor BudgieInWA
Kurze Antwort: ja, customer_id haben soll index.
Bessere Antwort: Es wäre am besten, finden Sie eine query analyzer für MySql und es verwenden, um zu bestimmen, was die eigentliche Ursache für die Verlangsamung ist.
Zum Beispiel könnte man ERKLÄREN, bevor Ihr wählen und sehen, was das Ergebnis ist.
Optimierung von MySQL: Abfragen und Indizes
InformationsquelleAutor darren