Spróbowałbym następujących:
Najpierw upewnij się, że w następujących tabelach i kolumnach znajdują się indeksy (każdy zestaw kolumn w nawiasach powinien być osobnym indeksem):
table1 : (subscribe, CDate)
(CU_id)
table2 : (O_cid)
(O_ref)
table3 : (I_oref)
(I_pid)
table4 : (P_id)
(P_cat)
table5 : (C_id, store)
Po drugie, jeśli dodanie powyższych indeksów nie poprawiło sytuacji tak bardzo, jak byś chciał, spróbuj przepisać zapytanie jako
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
Mam nadzieję, że pierwszy wybór podrzędny znacznie zmniejszy liczbę wierszy, które należy wziąć pod uwagę przy łączeniu, mając nadzieję, że kolejne łączenia będą mniej pracochłonne. To samo dotyczy rozumowania drugiego podwyboru w tabeli 5.
W każdym razie zadzieraj z tym. Chodzi mi o to, że ostatecznie to tylko SELECT - tak naprawdę nie możesz nim zaszkodzić. Zbadaj plany generowane przez każdą inną permutację i spróbuj dowiedzieć się, co jest w nich dobre, a co złe.
Dziel się i ciesz.