Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kann ich die MySQL-Abfrage mit mehreren Verknüpfungen beschleunigen?

Ich würde Folgendes versuchen:

Stellen Sie zunächst sicher, dass Indizes für die folgenden Tabellen und Spalten vorhanden sind (jeder Satz von Spalten in Klammern sollte ein separater Index sein):

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

Zweitens wenn Das Hinzufügen der obigen Indizes hat die Dinge nicht so verbessert, wie Sie möchten, versuchen Sie, die Abfrage neu zu schreiben als

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

Ich hoffe hier, dass die erste Unterauswahl die Anzahl der Zeilen, die für die Verknüpfung berücksichtigt werden sollen, erheblich reduzieren würde, wodurch die nachfolgenden Verknüpfungen hoffentlich weniger Arbeit leisten. Das Gleiche gilt für die Argumentation hinter der zweiten Unterauswahl in Tabelle 5.

Auf jeden Fall damit rummachen. Ich meine, letztendlich ist es nur ein SELECT - damit kann man nichts wirklich schaden. Untersuchen Sie die Pläne, die von jeder unterschiedlichen Permutation generiert werden, und versuchen Sie herauszufinden, was an jeder gut oder schlecht ist.

Teilen und genießen.