我有乙個包含大約1億條記錄的大表,其字段為start_date和end_date,具有date型別.我需要檢查一些日期範圍的重疊次數,比如介於2013-08-20和2013-08-30之間,所以我使用了.
select count(*) from mytable where end_date >= '2013-08-20'
and start_date <= '2013-08-30'
日期列已編制索引.
重要的一點是,我搜尋重疊的日期範圍總是在將來,而表中記錄的主要部分是過去的(比如大約97-99百萬).
那麼,這個查詢會更快,如果我新增乙個列is_future – tinyint,那麼,通過只檢查這樣的條件
select count(*) from mytable where is_future = 1
and end_date >= '2013-08-20' and start_date <= '2013-08-30'
它將排除剩餘的9700萬左右的記錄,並將僅檢查剩餘的1-3百萬條記錄的日期條件?
我使用mysql
謝謝編輯
mysql引擎是innodb,但如果說是myisam則會很重要
這是建立表
create table `orders` (
`id` bigint(20) not null auto_increment,
`title`
`start_date` date default null,
`end_date` date default null,
primary key (`id`)
) engine=innodb auto_increment=24 default charset=utf8 collate=utf8_bin;
在@robert co回答後編輯2
對於這種情況,分割槽看起來是乙個好主意,但它不允許我建立基於is_future欄位的分割槽,除非我將其定義為主鍵,否則我應該刪除我的主要主鍵 – id,我不能這樣做.因此,如果我將該字段定義為主鍵,那麼是否存在分割槽的含義,如果我通過作為主鍵的is_future欄位進行搜尋,則不會很快.
編輯3我需要使用它的實際查詢是選擇具有該日期範圍的一些免費**的餐廳
select r.id, r.name, r.table_count
from restaurants r
left join orders o
on r.id = o.restaurant_id
where o.id is null
or (r.table_count > (select count(*)
from orders o2
where o2.restaurant_id = r.id and
end_date >= '2013-08-20' and start_date <= '2013-08-30'
and o2.status = 1
解經過更多的研究和測試,在我的情況下計算行數的最快方法是再新增乙個條件,start_date超過當前日期(因為搜尋的日期範圍總是在將來)
select count(*) from mytable where end_date >= '2013-09-01'
and start_date >= '2013-08-20' and start_date <= '2013-09-30'
還有乙個索引 – 有start_date和end_date欄位(謝謝@symcbean).
結果,從7秒開始的10公尺行的表上執行時間變為0.050秒.
解決方案2(@robert co)
在這種情況下分割槽工作也一樣! – 也許它比索引更好的解決方案.或者它們都可以一起應用.
謝謝
總結 谷歌按時間搜尋
1 按照時間段進行查詢 tbs 是用來根據時間查詢的引數,tbs rltm 1是查詢最新結果,tbs qdr d或w或y分別為一天內 一周內 一年內的意 最新結果 tbs rltm 1 一天內 tbs qdr d 兩天內 tbs qdr d2 一周內 tbs qdr w 乙個月內 tbs qdr m...
總結 谷歌按時間搜尋
1 按照時間段進行查詢 tbs 是用來根據時間查詢的引數,tbs rltm 1是查詢最新結果,tbs qdr d或w或y分別為一天內 一周內 一年內的意 最新結果 tbs rltm 1 一天內 tbs qdr d 兩天內 tbs qdr d2 一周內 tbs qdr w 乙個月內 tbs qdr m...
mysql按章 mysql按時間範圍分割槽
1 問題描述 mysql的開發人員經常按時間範圍分割槽不知道時間上怎麼寫,筆者把總結歸納下來,能幫助自已和分享成果。2 解決問題 mysql對時間範圍分割槽,可以是按年,按月,按天,按分,按秒,如下案例,這裡注意點 範圍分割槽是乙個開始是開區間,結束是閉區間 0,10 10,20 20,30 2.1...