これは、この問題の一般的な解決策です。各サブクエリは、この方法でインデックスを利用できます。
select flightname from flightdetails where departure between fromDate and toDate
union
select flightname from flightdetails where arrival between fromDate and toDate;
@SalmanAからのコメントを再確認
そうです、上記のクエリは次のようなケースを見逃しています。
departure < fromDate < toDate < arrival
出発も到着も日付範囲の間にないので、もちろん日付範囲は飛行時間に含まれています。
これはあなたに基づいた別の解決策ですが、出発時と到着時の両方でインデックスを利用します。条件ごとに複合インデックスを作成してください。
create index flt_d on flightdetails(flightname, departure);
create index flt_a on flightdetails(flightname, arrival);
select f1.flightname
from flightdetails f1
join flightdetails f2 use index (flt_a)
on f1.flightname = f2.flightname
where f1.departure <= toDate
and f2.arrival >= fromDate;
これをテストし、「インデックスを使用」ヒントを使用して2番目のインデックスを使用するように誘導する必要がありましたが、実行すると、次のオプティマイザープランが得られました。
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: f1
type: index
possible_keys: flt_d,flt_a
key: flt_d
key_len: 20
ref: NULL
rows: 3
Extra: Using where; Using index
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: f2
type: ref
possible_keys: flt_a
key: flt_a
key_len: 12
ref: test.f1.flightname
rows: 1
Extra: Using where; Using index