Jeg ville prøve følgende:
Først skal du sikre dig, at der er indekser på følgende tabeller og kolonner (hvert sæt kolonner i parentes skal være et separat indeks):
table1 : (subscribe, CDate)
(CU_id)
table2 : (O_cid)
(O_ref)
table3 : (I_oref)
(I_pid)
table4 : (P_id)
(P_cat)
table5 : (C_id, store)
For det andet hvis tilføjelse af ovenstående indekser forbedrede ikke tingene så meget, som du gerne ville, prøv at omskrive forespørgslen som
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
Jeg håber her, at det første undervalg ville skære betydeligt ned på antallet af rækker, der skal tages i betragtning til at deltage, og forhåbentlig få de efterfølgende sammenføjninger til at gøre mindre arbejde. Ditto ræsonnementet bag det andet undervalg på tabel 5.
Under alle omstændigheder, rode med det. Jeg mener, i sidste ende er det bare et SELECT - du kan ikke rigtig skade noget med det. Undersøg de planer, der genereres af hver forskellig permutation, og prøv at finde ud af, hvad der er godt eller dårligt ved hver enkelt.
Del og nyd.