用戶將選擇日期,例如2017年3月6日,我需要檢索早於2017年3月6日的數十萬條記錄(但可能會因用戶選擇而異)。檢查日期範圍內的最快結果
從上面的情況來看,我用這個查詢SELECT col from table_a where DATE_FORMAT(mydate,'%Y%m%d') < '20170306'
我覺得這個記錄有點慢。有沒有更快或最快的方法來獲得這樣的日期結果?
用戶將選擇日期,例如2017年3月6日,我需要檢索早於2017年3月6日的數十萬條記錄(但可能會因用戶選擇而異)。檢查日期範圍內的最快結果
從上面的情況來看,我用這個查詢SELECT col from table_a where DATE_FORMAT(mydate,'%Y%m%d') < '20170306'
我覺得這個記錄有點慢。有沒有更快或最快的方法來獲得這樣的日期結果?
的相同的數據類型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。它會嘗試使用最快的方法,這仍然可以是全表掃描。
如果您在比較左側的任何列中進行函數調用,MySql將進行全表掃描。
最快的方法是有一個指數mydate
創建,使右側(「20170306」)的列(和索引)
你是什麼意思'使右側('20170306')與列'相同的數據類型?你的意思是我需要格式化('20170306')爲varchar/integer/date? –
是的,請查看http://stackoverflow.com/a/14104364/7302869 –
是從你的數據庫中存儲一列,還是來自外部(用戶輸入)的值? – Olli
mydate是我數據庫中的一列。值'20170306'來自用戶輸入。 –