0

3 つの MySQL テーブルがあります。 PRODUCTは 2 人の子供を持つ親でUK_SALESあり、AUS_SALES. UK_SALESとの構造AUS_SALESは同じでPRODUCT、製品 ID を介して関連付けられています。

特定のカテゴリの製品について、UK と AUS での売上の和を取得したいので、次のクエリを使用しています。

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'

今、それはうまくいきますが、それが最適かどうかはわかりません。具体的には、製品テーブルを2回スキャンして制限すると思います

WHERE p.category = 'electrical'.

これは本当にそうですか?それとも、MySQL は 2 番目の選択で使用するために最初のフィルターの結果をキャッシュしますか?

第二に、このクエリを記述するより良い方法はありますか?

製品テーブルと売上テーブルは両方とも数百万のレコードに実行されるため、パフォーマンスが重要になります。

ありがとう!

4

1 に答える 1

0

2 つのテーブル (UK と AU の販売) に重複はないと思いますが、重複がある場合は単なる偶然であり、両方が必要なので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' ;

インデックス onは、両方のサブクエリに使用され、まったくアクセスされないproduct (category, id)ため、実行計画にも役立ちます。product

于 2013-01-03T22:25:22.767 に答える