0

ここに問題があります。私はテーブルを持っています

flightdetails
-----------+-------------
flightName | varchar(200)
departure  | date
arrival    | date

指定された日付範囲のすべてのフライトを取得したい。fromDateまたはtoDateは、指定された日付範囲内にある必要があります。結果が得られる簡単なクエリを知っています

select flightname from flightdetails where (departure between fromDate and toDate)
or (arrival between fromDate and toDate);

しかし、OR条件を使用しているため、これはパフォーマンスには良くありません。パフォーマンスを優先するより良いソリューションを誰かが提案できますか

4

2 に答える 2

2

これは、この問題の一般的な解決策です。各サブクエリは、この方法でインデックスを利用できます。

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
于 2012-12-24T17:58:03.953 に答える
1

私はあなたがこのクエリを使うことができると思います:

-- 2.2) select date ranges that overlap [d1, d2] (d2 and end_date are inclusive)  
SELECT * FROM <table> WHERE @d2 >= start_date AND end_date >= @d1

いくつかの置換を行います。たとえば、start_dateは出発になり、end_dateは到着になります。

SELECT flightname
FROM   flightdetails
WHERE  toDate >= departure AND arrival >= fromDate
于 2012-12-24T18:08:19.090 に答える