Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment puis-je accélérer l'exécution de cette requête ?

Index

  • Vous avez besoin - au moins - un index sur chaque champ utilisé dans un JOIN état.

  • Index sur les champs qui apparaissent dans WHERE ou GROUP BY ou ORDER 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)