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

Comment puis-je accélérer la requête MySQL avec plusieurs jointures

J'essaierais ce qui suit :

Tout d'abord, assurez-vous qu'il existe des index sur les tables et colonnes suivantes (chaque ensemble de colonnes entre parenthèses doit être un index distinct) :

table1 : (subscribe, CDate)
         (CU_id)
table2 : (O_cid)
         (O_ref)
table3 : (I_oref)
         (I_pid)
table4 : (P_id)
         (P_cat)
table5 : (C_id, store)

Deuxièmement, si l'ajout des index ci-dessus n'a pas amélioré les choses autant que vous le souhaiteriez, essayez de réécrire la requête en tant que

SELECT DISTINCT t1.first_name, t1.last_name, t1.email FROM
  (SELECT CU_id, t1.first_name, t1.last_name, t1.email
     FROM table1
     WHERE subscribe = 1 AND
           CDate >= $startDate AND
           CDate <= $endDate) AS t1
  INNER JOIN table2 AS t2
    ON t1.CU_id = t2.O_cid   
  INNER JOIN table3 AS t3
    ON t2.O_ref = t3.I_oref   
  INNER JOIN table4 AS t4
    ON t3.I_pid = t4.P_id   
  INNER JOIN (SELECT C_id FROM table5 WHERE store = 2) AS t5
    ON t4.P_cat = t5.C_id

J'espère ici que la première sous-sélection réduira considérablement le nombre de lignes à prendre en compte pour la jointure, ce qui, espérons-le, permettra aux jointures suivantes de faire moins de travail. Idem le raisonnement derrière la deuxième sous-sélection sur table5.

Dans tous les cas, faites gaffe. Je veux dire, en fin de compte, c'est juste un SELECT - vous ne pouvez vraiment rien blesser avec. Examinez les plans générés par chaque permutation différente et essayez de déterminer ce qui est bon ou mauvais pour chacun.

Partagez et profitez.