Indizes
-
Sie brauchen - mindestens - ein Index für jedes Feld, das in einem
JOIN
verwendet wird Zustand. -
Indizes für die Felder, die in
WHERE
erscheinen oderGROUP BY
oderORDER BY
Klauseln sind meistens auch nützlich. -
Wenn in einer Tabelle zwei oder mehr Felder in JOIns (oder WHERE oder GROUP BY oder ORDER BY) verwendet werden, kann ein zusammengesetzter (kombinierter) Index dieser (zwei oder mehr) Felder besser sein als separate Indizes. Zum Beispiel in den
SiteNumbers
Tabelle, mögliche Indizes sind die Verbindung(number_accountid, number_active)
oder(number_active, number_accountid)
. -
Bedingungen in booleschen Feldern (EIN/AUS, aktiv/inaktiv) verlangsamen manchmal Abfragen (da Indizes nicht selektiv und daher nicht sehr hilfreich sind). Eine Umstrukturierung (Vater-Normalisierung) der Tabellen ist in diesem Fall eine Option, aber wahrscheinlich können Sie die zusätzliche Komplexität vermeiden.
Neben den üblichen Ratschlägen (untersuchen Sie den EXPLAIN-Plan, fügen Sie bei Bedarf Indizes hinzu, testen Sie Variationen der Abfrage),
Mir ist aufgefallen, dass Ihre Abfrage ein partielles kartesisches Produkt enthält. Die Tabelle Accounts
hat eine Eins-zu-Viele-Beziehung zu drei Tabellen FTPDetails
, SiteNumbers
und PPC
. Dies hat den Effekt, dass, wenn Sie beispielsweise 1000 Konten haben und jedes Konto sich auf beispielsweise 10 FTPDetails, 20 SiteNumbers und 3 PPCs bezieht, die Abfrage für jedes Konto 600 Zeilen (das Produkt von 10x20x3) zurückgibt. Insgesamt 600.000 Zeilen, in denen viele Daten dupliziert werden.
Sie könnten stattdessen die Abfrage in drei plus eins für die Basisdaten aufteilen (Konto und die restlichen Tabellen). Auf diese Weise würden nur 34.000 Datenzeilen (mit geringerer Länge) übertragen:
Accounts JOIN Clients JOIN Users
(with all fields needed from these tables)
1K rows
Accounts JOIN FTPDetails
(with Accounts.account_id and all fields from FTPDetails)
10K rows
Accounts JOIN SiteNumbers
(with Accounts.account_id and all fields from SiteNumbers)
20K rows
Accounts JOIN PPC
(with Accounts.account_id and all fields from PPC)
3K rows
und verwenden Sie dann die Daten aus den 4 Abfragen auf der Clientseite, um kombinierte Informationen anzuzeigen.
Ich würde die folgenden Indizes hinzufügen:
Table Accounts
index on (account_designer)
index on (account_client)
index on (account_active, account_id)
index on (account_update)
Table FTPDetails
index on (ftp_active, ftp_accountid)
Table SiteNumbers
index on (number_active, number_accountid)
Table PPC
index on (ppc_active, ppc_accountid)