0

3 つのテーブル (*主キー+用、外部用)を検討してください。

User {*id:INTEGER, name:VARCHAR(45)}
Flight {*id:INTEGER, service:VARCHAR(45), departureDate:DATETIME}
Reservation { +userId, +flightId }

データ:

ユーザー:

ユーザー

フライト:

フライト

予約:

予約

次のクエリは、 で旅行する乗客のリストを取得します2013-05-06

SELECT *
FROM user u, flight f, reservation r
WHERE u.id=f.id AND r.userid=u.id AND r.flightid=f.id AND f.departureDate='2013-05-06'

私が持っている質問は次のとおりです。

  1. SQL エンジンは WHERE 句をどのように扱いますか? 上記のクエリを参照すると、最初に r.userid=u.id によって r と f を組み合わせて一時データ テーブル T1 を形成し、次に r.flightid=f.id によって T1 と f を組み合わせて別の一時テーブル T2 を形成し、最後に DepartureData をフィルタリングします。 T2で?

  2. 句が次のように変更された場合、パフォーマンスに変化はありますWHERE f.departureDate='2013-05-06' AND u.id=f.id AND r.userid=u.id AND r.flightid=f.idか? その場合、 f.departureDate='2013-05-06' は行を減らして一時テーブルを形成しますか?

4

2 に答える 2

2

1) いいえ、順序は重要ではありません。それはすべてDBエンジンに関するものです。DB エンジンは、基本的なコマンドを最初に実行し、その他の複雑なコマンドを後で実行するなど、賢明な選択を行うことができます。したがって、ステートメントの並べ替えについては考えないでください。クエリ オプティマイザーが自動的に実行します。クエリオプティマイザーが行うことの基本的な例を挙げると、次のステートメントの変換です。

(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)

B=5 または B=6

2) 繰り返しますが、違いはありません。

MySql Query Optimizer が行うことの完全なリストはありませんが、ここでいくつかを見つけることができます

于 2013-05-06T12:26:53.147 に答える