Index
-
Du behöver - minst - ett index på varje fält som används i en
JOIN
skick. -
Indexer på fälten som visas i
WHERE
ellerGROUP BY
ellerORDER BY
klausuler är för det mesta också användbara. -
När i en tabell används två eller flera fält i JOIns (eller WHERE eller GROUP BY eller ORDER BY), kan ett sammansatt (kombinerat) index av dessa (två eller fler) fält vara bättre än separata index. Till exempel i
SiteNumbers
tabell, möjliga index är sammansättningen(number_accountid, number_active)
eller(number_active, number_accountid)
. -
Tillstånd i fält som är booleska (PÅ/AV, aktiv/inaktiv) är ibland långsammare frågor (eftersom index inte är selektiva och därför inte är särskilt användbara). Omstrukturering (fadernormalisering) av tabellerna är ett alternativ i så fall, men förmodligen kan du undvika den extra komplexiteten.
Förutom de vanliga råden (granska EXPLAIN-planen, lägg till index vid behov, testa varianter av frågan),
Jag märker att det i din fråga finns en partiell kartesisk produkt. Tabellen Accounts
har en en-till-många-relationer till tre tabeller FTPDetails
, SiteNumbers
och PPC
. Detta har effekten att om du till exempel har 1000 konton, och varje konto är relaterat till, säg, 10 FTPDetails, 20 SiteNumbers och 3 PPCs, kommer frågan att returnera 600 rader för varje konto (produkten av 10x20x3). Totalt 600 000 rader där många data dupliceras.
Du kan istället dela upp frågan i tre plus en för basdata (Konto och resten tabeller). På så sätt skulle endast 34K rader med data (med mindre längd) överföras:
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
och använd sedan data från de 4 frågorna på klientsidan för att visa kombinerad information.
Jag skulle lägga till följande index:
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)