mysql 按時間搜尋 按日期搜尋mysql效能

2021-10-17 17:57:57 字數 1845 閱讀 9296

我有乙個包含大約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...