別のテーブルの別のフィールドに一致するフィールド情報を解析する必要があるこのクエリを実行する必要があります。次に、いくつかのテーブルでリンスして繰り返すと、最終的に目的の行が返されます。
問題は、どうすればこれを高速化できるかということです...数十万行が返され、クエリがクラッシュを引き起こしているため、クライアントの管理セクションでうまく機能していません。
クエリは次のとおりです。
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM (
SELECT CU_id, CU_ship_name1, CU_ship_name2, CU_email
FROM customers
WHERE CU_solicit=1
AND CU_cdate >=".$startDate."
AND CU_cdate <=".$endDate."
)AS t1
INNER JOIN orders AS t2 ON t1.CU_id = t2.O_cid
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id FROM category WHERE C_store_type =1
) AS t5 ON t4.P_cat = t5.C_id
「customers」、「orders」、「item」テーブルは毎月数万の新しい行で更新され、「product」テーブルは毎月少なくとも 100 行の新しい行を受け取ります。
私が考えられる唯一のことは、この情報を保持する新しいテーブルを作成し (これは理想的な解決策ではありません)、これらのテーブルにインデックスを追加することでした。これらのテーブルは非常に多くの新しいデータを取得するため、インデックスを恐れていますが、試してみるつもりです (いつでも元に戻すことができますか?)。しかし、インデックス自体が問題を解決するとは思えません。
更新:私は現在、このクエリを使用しており、より高速な結果を取得しています。すべての WHERE および JOIN ON 行のインデックスを作成しても、まったく役に立ちませんでした...理由がわかりません。
サブクエリの削除:
以下のクエリで 3 ~ 4 秒から、同じ permeters で 151 秒まで、クエリの速度に悲惨な影響を与えました。
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM customers AS t1
WHERE t1.CU_solicit=1
AND t1.CU_cdate>= 20100725000000
AND t1.CU_cdate<= 20100801000000
AND EXISTS(
SELECT NULL FROM orders AS t2
INNER JOIN item AS t3 ON t2.O_ref = t3.I_oref
INNER JOIN product AS t4 ON t3.I_pid = t4.P_id
INNER JOIN (
SELECT C_id
FROM category
WHERE C_store_type = 2
) AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_id = t2.O_cid);
気にしないでください、私はそれらを通常の結合とサブクエリなしに変更しました。クエリは次のとおりです。
SELECT DISTINCT t1.CU_ship_name1, t1.CU_ship_name2, t1.CU_email
FROM customers AS t1
JOIN orders AS t2 ON t1.CU_id = t2.O_cid
JOIN item AS t3 ON t2.O_ref = t3.I_oref
JOIN product AS t4 ON t3.I_pid = t4.P_id
JOIN category AS t5 ON t4.P_cat = t5.C_id
WHERE t1.CU_solicit =1
AND t1.CU_cdate >=20100425000000
AND t1.CU_cdate <=20100801000000
AND t5.C_store_type =2