1

次の SQL クエリに基づいて生成されるドロップダウン リストがあります。

 
SELECT * FROM product WHERE 
    product.id NOT IN (SELECT customer_1.product_id FROM customer_1 WHERE (customer_1.product_id != '$x'))
AND product.id NOT IN (SELECT customer_2.product_id FROM customer_2 WHERE (customer_2.product_id != '$x'))
AND product.id NOT IN (SELECT customer_3.product_id FROM customer_3 WHERE (customer_3.product_id != '$x'));
 

ここで発生する問題は、実行時間です。このクエリ自体は、約 5.3 秒かかります。同じページに他の同様のクエリがいくつかあります。

私の質問は次のとおりです。同じ結果を達成するためのより良い、より速い方法はありますか?

前もって感謝します。

4

3 に答える 3

2

LEFT JOIN結合の右側 (customer_*テーブル)で NULL を検索すると、s のパフォーマンスが向上する場合があります。あなたの目標を理解していれば、これでうまくいくはずです:

SELECT
  products.*
FROM
  products
  LEFT JOIN customer_1 ON products.id = customer_1.product_id
  LEFT JOIN customer_2 ON products.id = customer_2.product_id
  LEFT JOIN customer_3 ON products.id = customer_3.product_id
WHERE
  products.id != '$x'
  AND customer_1.product_id IS NULL
  AND customer_2.product_id IS NULL
  AND customer_3.product_id IS NULL
于 2012-06-15T13:38:42.800 に答える
1
    SELECT * FROM product Left join (SELECT customer_1.product_id FROM customer_1 WHERE (customer_1.product_id != '$x')) as t1 Left join (SELECT customer_2.product_id FROM customer_2 WHERE (customer_2.product_id != '$x')) as t2 left join (SELECT customer_3.product_id FROM customer_3 WHERE customer_3.product_id != '$x')) as t3
And t3.product_id is null and t1.product_id is null and t2.product_id is null
于 2012-06-15T13:40:07.023 に答える
1

おそらく使用する必要がありますNOT EXISTS。適切に索引付けされたテーブルを使用すると、この種の状況で大幅に高速化できます。

于 2012-06-15T13:39:11.020 に答える