2013-03-15 44 views
80

我正在設計一個大型數據庫。在我的應用程序中,我將有很多行,例如,我現在有一個包含400萬條記錄的表。我的大多數查詢都使用datetime子句來選擇數據。在mysql數據庫中索引datetime字段是個好主意嗎?在mysql中索引datetime字段是個好主意嗎?

Select field1, field2,.....,field15 
from table where field 20 between now() and now + 30 days 

我想保持我的數據庫工作良好,正在順利運行查詢

更多,你認爲什麼想法,我應該創造一個高效率的數據庫?

回答

102

MySQL的建議使用索引的原因有多種,包括條件之間消除行:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

這使你的datetime列一個很好的候選索引,如果你將要在條件經常用它查詢。如果您的唯一條件是BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY),並且您沒有其他索引條件,則MySQL將必須在每個查詢上執行全表掃描。我不確定在30天內生成了多少行,但只要不到總行數的1/3,在列上使用索引效率會更高。

有關創建高效數據庫的問題非常廣泛。我會說要確保它已經規範化並且所有適當的列都被索引(即在連接和where子句中使用的列)。

+3

謝謝你的解釋。這真的有幫助。我相信我會有更多的過濾器。我只是想確保索引日期時間字段是一個好主意或不是,因爲我們可能有重複的日期時間。但你的答案解釋了它:)謝謝 – Jaylen 2013-03-17 00:49:43

+3

+ 1爲「在連接和where子句中使用的」。索引策略的一個很好的經驗法則。我現在明白了,但在 – 2014-01-31 11:16:01

7

Here作者執行的測試顯示整數unix時間戳比DateTime更好。請注意,他使用了MySql。但我覺得不管你用什麼數據庫引擎比較整數比比較日期稍快,所以int index比DateTime索引好。取T1 - 比較2個日期的時間,T2 - 比較2個整數的時間。在索引字段上搜索大約需要O(log(rows))時間,因爲基於某些平衡樹的索引 - 對於不同的數據庫引擎可能會不同,但無論如何,Log(行)是常用估計。 (如果你不使用位掩碼或基於r-tree的索引)。所以區別在於(T2-T1)*日誌(行) - 如果您經常執行查詢,可能會發揮作用。

+0

之前我沒有想過謝謝。我正在考慮作爲一種選擇,但不知道如何處理它。我相信你是絕對正確的整數總是更快。 – Jaylen 2013-03-17 00:47:44

+26

更好?我懷疑一個unix時間戳對於所有情況都更好。是的,存儲一個整數通常比存儲一個字符串更快,但是所有的[DateTime函數](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html )MySQL公開?自己實施它們會對性能或功能產生負面影響。 – Greg 2013-09-26 12:13:21

相關問題