Indici
-
Hai bisogno - almeno - un indice su ogni campo utilizzato in un
JOIN
condizione. -
Indici sui campi che compaiono in
WHERE
oGROUP BY
oORDER BY
anche le clausole sono il più delle volte utili. -
Quando in una tabella vengono utilizzati due o più campi in JOIns (o WHERE o GROUP BY o ORDER BY), un indice composto (combinato) di questi (due o più) campi può essere migliore di indici separati. Ad esempio nel
SiteNumbers
tabella, i possibili indici sono il composto(number_accountid, number_active)
o(number_active, number_accountid)
. -
Le condizioni nei campi booleani (ON/OFF, attivo/inattivo) a volte rallentano le query (poiché gli indici non sono selettivi e quindi non molto utili). La ristrutturazione (normalizzazione del padre) delle tabelle è un'opzione in questo caso, ma probabilmente puoi evitare la complessità aggiuntiva.
Oltre ai soliti consigli (esaminare il piano EXPLAIN, aggiungere gli indici dove necessario, testare le variazioni della query),
Noto che nella tua domanda c'è un prodotto cartesiano parziale. La tabella Accounts
ha una relazione uno-a-molti con tre tabelle FTPDetails
, SiteNumbers
e PPC
. Questo ha l'effetto che se hai ad esempio 1000 account e ogni account è correlato, diciamo, a 10 FTPDetails, 20 SiteNumbers e 3 PPC, la query restituirà per ogni account 600 righe (il prodotto di 10x20x3). In totale 600.000 righe in cui sono duplicati molti dati.
Potresti invece dividere la query in tre più uno per i dati di base (Account e le altre tabelle). In questo modo, verrebbero trasferite solo 34.000 righe di dati (di lunghezza inferiore):
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
e quindi utilizza i dati delle 4 query sul lato client per mostrare le informazioni combinate.
Aggiungerei i seguenti indici:
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)