Indexen
-
Je hebt - minstens . nodig - een index op elk veld dat wordt gebruikt in een
JOIN
staat. -
Indexen op de velden die verschijnen in
WHERE
ofGROUP BY
ofORDER BY
clausules zijn meestal ook nuttig. -
Wanneer in een tabel twee of meer velden worden gebruikt in JOIns (of WHERE of GROUP BY of ORDER BY), kan een samengestelde (gecombineerde) index van deze (twee of meer) velden beter zijn dan afzonderlijke indexen. Bijvoorbeeld in de
SiteNumbers
tabel, mogelijke indexen zijn de samengestelde(number_accountid, number_active)
of(number_active, number_accountid)
. -
Voorwaarde in velden die Booleaans zijn (AAN/UIT, actief/inactief) vertragen soms zoekopdrachten (omdat indexen niet selectief zijn en dus niet erg nuttig). Herstructureren (vader normaliseren) van de tabellen is in dat geval een optie, maar waarschijnlijk kun je de extra complexiteit vermijden.
Naast het gebruikelijke advies (bekijk het EXPLAIN plan, voeg indexen toe waar nodig, test variaties van de zoekopdracht),
Ik merk dat er in uw vraag een gedeeltelijk Cartesiaans product is. De tabel Accounts
heeft een één-op-veel relatie met drie tabellen FTPDetails
, SiteNumbers
en PPC
. Dit heeft als effect dat als je bijvoorbeeld 1000 accounts hebt, en elke account is gerelateerd aan bijvoorbeeld 10 FTPDetails, 20 SiteNumbers en 3 PPC's, de query voor elke account 600 rijen teruggeeft (het product van 10x20x3). In totaal 600K rijen waar veel gegevens worden gedupliceerd.
U kunt de query in plaats daarvan splitsen in drie plus één voor basisgegevens (account en de overige tabellen). Op die manier zouden slechts 34K gegevensrijen (met een kleinere lengte) worden overgedragen:
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
en gebruik vervolgens de gegevens van de 4 zoekopdrachten aan de clientzijde om gecombineerde informatie weer te geven.
Ik zou de volgende indexen toevoegen:
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)