Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie würde ich diese Abfrage schneller ausführen lassen?

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 oder GROUP BY oder ORDER 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)