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.