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

Come potrei velocizzare questa query?

Indici

  • Hai bisogno - almeno - un indice su ogni campo utilizzato in un JOIN condizione.

  • Indici sui campi che compaiono in WHERE o GROUP BY o ORDER 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)