Index
-
Vous avez besoin - au moins - un index sur chaque champ utilisé dans un
JOIN
état. -
Index sur les champs qui apparaissent dans
WHERE
ouGROUP BY
ouORDER BY
les clauses sont la plupart du temps utiles aussi. -
Lorsque dans une table, deux champs ou plus sont utilisés dans des JOIns (ou WHERE ou GROUP BY ou ORDER BY), un index composé (combiné) de ces champs (deux ou plus) peut être préférable à des index séparés. Par exemple dans les
SiteNumbers
table, les index possibles sont le composé(number_accountid, number_active)
ou(number_active, number_accountid)
. -
Les conditions dans les champs booléens (ON/OFF, actif/inactif) ralentissent parfois les requêtes (car les index ne sont pas sélectifs et donc peu utiles). La restructuration (normalisation paternelle) des tables est une option dans ce cas, mais vous pouvez probablement éviter la complexité supplémentaire.
Outre les conseils habituels (examiner le plan EXPLAIN, ajouter des index si nécessaire, tester des variantes de la requête),
Je remarque que dans votre requête, il y a un produit cartésien partiel. Le tableau Accounts
a une relation un-à-plusieurs avec trois tables FTPDetails
, SiteNumbers
et PPC
. Cela a pour effet que si vous avez par exemple 1000 comptes, et que chaque compte est lié à, disons, 10 FTPDetails, 20 SiteNumbers et 3 PPC, la requête renverra pour chaque compte 600 lignes (le produit de 10x20x3). Au total, 600 000 lignes où de nombreuses données sont dupliquées.
Vous pouvez plutôt diviser la requête en trois plus un pour les données de base (Compte et les autres tables). De cette façon, seules 34K lignes de données (ayant une longueur plus petite) seraient transférées :
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
puis utilisez les données des 4 requêtes côté client pour afficher les informations combinées.
J'ajouterais les index suivants :
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)