這是一個常見的解決方案,這個問題。每個子查詢都可以通過這種方式使用索引。從@SalmanA
你說得對
select flightname from flightdetails where departure between fromDate and toDate
union
select flightname from flightdetails where arrival between fromDate and toDate;
回覆評論,上述查詢錯過情況是這樣的:
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;
我測試了這一點,我不得不使用「使用索引」提示哄它使用第二個索引,但是當我做我得到這個優化方案:
*************************** 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
到達將始終> =離開,對嗎? –
是的。抵達時離開時間更大 – Akhil