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的 s 应该会有所帮助。

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 回答