次のことを試してみます:
まず、次のテーブルと列にインデックスがあることを確認します(括弧内の列の各セットは個別のインデックスである必要があります):
table1 : (subscribe, CDate)
(CU_id)
table2 : (O_cid)
(O_ref)
table3 : (I_oref)
(I_pid)
table4 : (P_id)
(P_cat)
table5 : (C_id, store)
次に、 if 上記のインデックスを追加しても、期待したほど改善されませんでした。クエリを次のように書き直してみてください
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
ここで、最初の副選択によって、結合の対象となる行数が大幅に削減され、後続の結合の作業が少なくなることを期待しています。表5の2番目のサブ選択の背後にある理由と同じです。
いずれにせよ、それを台無しにします。つまり、最終的には単なるSELECTであり、実際に何も傷つけることはできません。それぞれの異なる順列によって生成された計画を調べて、それぞれの良い点と悪い点を見つけ出してください。
共有してお楽しみください。