sql >> Database teknologi >  >> RDS >> Mysql

Hvordan får jeg denne forespørgsel til at køre hurtigere?

Indekser

  • Du har brug for - mindst - et indeks på hvert felt, der bruges i en JOIN tilstand.

  • Indekser på de felter, der vises i WHERE eller GROUP BY eller ORDER BY klausuler er det meste af tiden også nyttige.

  • Når der i en tabel bruges to eller flere felter i JOIns (eller WHERE eller GROUP BY eller ORDER BY), kan et sammensat (kombineret) indeks af disse (to eller flere) felter være bedre end separate indekser. For eksempel i SiteNumbers tabel, er mulige indekser den sammensatte (number_accountid, number_active) eller (number_active, number_accountid) .

  • Tilstand i felter, der er boolske (ON/OFF, aktiv/inaktiv) er nogle gange langsommere forespørgsler (da indekser ikke er selektive og derfor ikke er særlig nyttige). Omstrukturering (fader normalisering) af tabellerne er en mulighed i så fald, men sandsynligvis kan du undgå den ekstra kompleksitet.

Udover de sædvanlige råd (undersøg EXPLAIN-planen, tilføj indekser, hvor det er nødvendigt, test variationer af forespørgslen),

Jeg bemærker, at der i din forespørgsel er et delvist kartesisk produkt. Tabellen Accounts har en en-til-mange relationer til tre tabeller FTPDetails , SiteNumbers og PPC . Dette har den effekt, at hvis du for eksempel har 1000 konti, og hver konto er relateret til f.eks. 10 FTPDetails, 20 SiteNumbers og 3 PPC'er, vil forespørgslen returnere 600 rækker for hver konto (produktet af 10x20x3). I alt 600.000 rækker, hvor mange data er duplikeret.

Du kunne i stedet opdele forespørgslen i tre plus én for basisdata (Konto og resten tabeller). På den måde ville kun 34K rækker af data (med mindre længde) blive overført :

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

og brug derefter dataene fra de 4 forespørgsler på klientsiden til at vise kombineret info.

Jeg vil tilføje følgende indekser:

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)


  1. Skift kolonnetyper i en stor tabel

  2. Betinget definere en markør

  3. Sorten, der spilder til niveau 15.000

  4. Henter linket liste i MySQL-database