我有以下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)
但是,在我的测试中,这个查询非常慢。我有什么选择来改进它?
答案 0 :(得分:4)
在所有这些表格的productid
和id
字段中使用索引。如果我们有加入字段的索引,JOIN将提供性能。
答案 1 :(得分: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
答案 2 :(得分: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
上添加索引。 (正如其他人所说)