2017-04-07 57 views
0

用戶將選擇日期,例如2017年3月6日,我需要檢索早於2017年3月6日的數十萬條記錄(但可能會因用戶選擇而異)。檢查日期範圍內的最快結果

從上面的情況來看,我用這個查詢SELECT col from table_a where DATE_FORMAT(mydate,'%Y%m%d') < '20170306'我覺得這個記錄有點慢。有沒有更快或最快的方法來獲得這樣的日期結果?

+0

是從你的數據庫中存儲一列,還是來自外部(用戶輸入)的值? – Olli

+0

mydate是我數據庫中的一列。值'20170306'來自用戶輸入。 –

回答

2

的相同的數據類型10萬條記錄中讀取數據,DBMS可能會決定閱讀表格記錄以進行記錄(全表掃描),並且不會有太多可以做的事情。

另一方面,如果表中包含數十億條記錄,那麼100,000只是一小部分,那麼DBMS可以決定使用索引。

無論如何,您至少應該讓DBMS有機會通過索引進行選擇。這意味着:首先創建索引(如果尚不存在)。

您可以在單獨的日期列上創建索引:

create index idx on table_a (mydate); 

甚至提供包含在查詢中使用其他列覆蓋索引,太:

create index idx on table_a (mydate, col); 

然後再編寫查詢以便直接訪問日期列。您在DATE_FORMAT(mydate,'%Y%m%d')上沒有索引,因此上述索引對您的原始查詢沒有幫助。你需要一個查詢,查找日期本身:

select col from table_a where mydate < date '2017-03-06'; 

無論DBMS然後使用索引與否仍達DBMS。它會嘗試使用最快的方法,這仍然可以是全表掃描。

1

如果您在比較左側的任何列中進行函數調用,MySql將進行全表掃描。

最快的方法是有一個指數mydate創建,使右側(「20170306」)的列(和索引)

+0

你是什麼意思'使右側('20170306')與列'相同的數據類型?你的意思是我需要格式化('20170306')爲varchar/integer/date? –

+1

是的,請查看http://stackoverflow.com/a/14104364/7302869 –