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
ellerGROUP BY
ellerORDER 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)