Jag skulle prova följande:
Se först till att det finns index i följande tabeller och kolumner (varje uppsättning kolumner inom parentes bör vara ett separat index):
table1 : (subscribe, CDate)
(CU_id)
table2 : (O_cid)
(O_ref)
table3 : (I_oref)
(I_pid)
table4 : (P_id)
(P_cat)
table5 : (C_id, store)
För det andra, om att lägga till ovanstående index förbättrade inte saker så mycket som du skulle vilja, försök att skriva om frågan 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
Jag hoppas här att det första undervalet skulle minska avsevärt antalet rader som ska övervägas för att gå med, förhoppningsvis göra att de efterföljande sammanfogningarna gör mindre arbete. Dito resonemanget bakom det andra undervalet på tabell 5.
Bråka i alla fall med det. Jag menar, i slutändan är det bara ett SELECT - du kan egentligen inte skada någonting med det. Undersök planerna som genereras av varje olika permutation och försök ta reda på vad som är bra eller dåligt med var och en.
Dela och njut.