Ik zou het volgende proberen:
Zorg er eerst voor dat er indexen zijn in de volgende tabellen en kolommen (elke set kolommen tussen haakjes moet een aparte index zijn):
table1 : (subscribe, CDate)
(CU_id)
table2 : (O_cid)
(O_ref)
table3 : (I_oref)
(I_pid)
table4 : (P_id)
(P_cat)
table5 : (C_id, store)
Ten tweede, als het toevoegen van de bovenstaande indexen heeft de zaken niet zoveel verbeterd als je zou willen, probeer de zoekopdracht te herschrijven 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
Ik hoop hier dat de eerste subselectie het aantal rijen dat in aanmerking komt voor deelname aanzienlijk zou verminderen, waardoor de volgende joins hopelijk minder werk doen. Idem voor de redenering achter de tweede subselectie op tabel5.
Ga er in ieder geval mee aan de slag. Ik bedoel, uiteindelijk is het gewoon een SELECT - je kunt er niets mee doen. Onderzoek de plannen die worden gegenereerd door elke verschillende permutatie en probeer erachter te komen wat goed of slecht is aan elk.
Deel en geniet.