0

我有三个 MySQL 表。 PRODUCT是有两个孩子的父母,UK_SALES并且AUS_SALES. UK_SALES和的结构AUS_SALES是相同的,它们是PRODUCT通过产品 ID 关联的。

我想获得给定产品类别在英国和澳大利亚的销售联盟,所以我使用这个查询:

SELECT au.* FROM aus_sales au
INNER JOIN product p on p.id = au.id
WHERE p.category = 'electrical'

UNION ALL

SELECT uk.* FROM uk_sales uk
INNER JOIN product p on p.id = uk.id
WHERE p.category = 'electrical'

现在,这很好用,但我不确定它是否是最佳的。具体来说,我认为产品表被扫描两次以将其限制为

WHERE p.category = 'electrical'.

真的是这样吗?或者 MySQL 是否会缓存第一个过滤器的结果以用于第二个选择?

其次,有没有更好的方法来编写这个查询?

我的产品和销售表都将包含数百万条记录,因此性能很重要。

谢谢!

4

1 回答 1

0

我想这两个表(英国和澳大利亚销售)没有重复,如果有,那只是巧合,你需要它们,所以UNION ALL用来避免排序(以及删除任何重复):

SELECT au.* FROM aus_sales au
INNER JOIN product p on p.id = au.id
WHERE p.category = 'electrical'

UNION ALL

SELECT uk.* FROM uk_sales uk
INNER JOIN product p on p.id = uk.id
WHERE p.category = 'electrical' ;

索引product (category, id)也将有助于执行计划,因为它将用于子查询并且product根本不会被访问。

于 2013-01-03T22:25:22.767 回答