2014-02-28 38 views
2

我有一個包含了一個start_dateend_date(包括索引,數據格式)項的表。我想返回今天介於這兩個日期之間的所有條目的列表。這裏有兩個選擇,我認爲:搜索2個日期之間的條目在MySQL

1)直接查詢: MySQL查詢(其中28/02/2014是可變的課程):

SELECT * FROM mytable WHERE '28/02/2014' BETWEEN start_date AND end_date 

2)日常的cronjob要經過所有條目並將當前在兩個日期之間的字段is_valid(布爾格式)更新爲true,否則爲false(因爲它不是面向客戶的,所以性能不太重要)。那麼MySQL查詢,選擇項爲:

SELECT * FROM mytable WHERE is_valid = 1 

的最終目標是擁有最快的查詢(將在搜索結果中這將是該網站的一個突出頁面中使用)時,項可能達到10萬,甚至數以百萬計的未來。我不知道索引日期是否足夠好,或者如果cronjob只是矯枉過正 - 或者有更好的方法來做到這一點!

在此先感謝您的建議,以供選擇!

編輯:感謝您的答覆 - 這是索引結構好? enter image description here

+1

保存日期爲INT時間戳和索引他們......當表長大了很多,你可以基於時間戳 – Hackerman

+0

取得分區如果你指數的日期要確保你有一個包含兩個日期覆蓋索引。 – Kickstart

+1

如果您在SELECT中具有用戶標識和類別標識,則您建議的索引將只縮小範圍。也就是說,當你運行select時,索引只會被用到它指向where子句中沒有的值的那一列。爲了您的使用,這可能很好。 – Kickstart

回答

0

如果你想這兩個選項之間的更快的查詢,那麼就沒有什麼像一個cron作業來設置適當的標誌。那麼你應該索引生成的列,否則你必須做一個全表掃描。沒有索引,這種方法可能比使用帶索引的日期要慢。

對於大多數用途,start_dateend_date上的複合索引是首選解決方案,應該足夠快。

我懷疑你正在提交給過早優化的守護進程。最快的方法是運行一個cron作業並將今天的數據加載到一個新的表格中,爲您的分析編制合適的索引和結構。除此之外,綜合指數是一個非常合理的方法。雖然更新標誌確實解決了問題,但它既不是最快也不是最乾淨的方法。

+0

謝謝 - 我不時要重複檢查我沒有養成壞習慣!如果將來成爲巨大的桌子,我會使用你的cronjob +專用桌面的建議。 – Davor

+0

@Davor。 。 。說實話,在開發應用程序時考慮可伸縮性能是一個好主意;我不想太過氣餒。我認爲它類似於引用錯誤的格言「金錢是萬惡之源」,正確的引語是「金錢之愛是萬惡之源」。也就是說,性能考慮是設計的重要部分。注意過早的表現在錯誤的時間和地點過於詳細。 –

0

我以前用過這個相同的模式。如果您擁有正確的索引,那麼查詢日期就足夠快了。