1

次の3つのMySQLテーブルがあります(table_name:column_listとして表示されます)。

tbl_product: id, name
tbl_sales: productid, date
tbl_impressions: productid, date

tbl_productsは利用可能な商品を保存し、tbl_salesは商品の各販売を保存し、 tbl_impressionsは商品の各印象を保存します。販売、展示、またはその両方の商品を探したいのですが。これについて私が試みたクエリは次のとおりです。

SELECT prod.name
FROM tbl_product prod
LEFT JOIN tbl_sales sales ON sales.productid=prod.id
LEFT JOIN tbl_impressions imp ON imp.productid=prod.id
WHERE (sales.productid IS NOT NULL) OR (imp.productid IS NOT NULL)

ただし、私のテストでは、このクエリは非常に低速です。それを改善するためにどのようなオプションがありますか?

4

3 に答える 3

4

これらすべてのテーブルのインデックスproductididフィールドを使用します。結合フィールドにインデックスがある場合、JOINはパフォーマンスを提供します。

于 2012-05-30T15:55:13.020 に答える
2
SELECT name FROM tbl_product INNER JOIN tbl_sales ON id = productid
UNION
SELECT name FROM tbl_product INNER JOIN tbl_impressions ON id = productid
于 2012-05-30T15:53:32.213 に答える
1

EXISTSの代わりに使用するとLEFT JOIN役立つはずです。

SELECT prod.name
FROM tbl_product prod
WHERE EXISTS ( SELECT 1 FROM tbl_sales sales WHERE sales.productid = prod.id )
   OR EXISTS ( SELECT 1 FROM tbl_impressions imp WHERE imp.productid = prod.id )

tbl_sales.productidとにインデックスを追加してくださいtbl_impressions.productid(他の人が言ったように)

于 2012-05-30T15:54:47.723 に答える