2013-05-31 38 views
4

的一部分,我使用頻繁以下查詢:使用時間戳(或日期時間)作爲主鍵(或聚集索引的一部分)

SELECT * FROM table WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime] and publish = 1 and type = 2 order by Timestamp 

我想優化這個查詢,我的想法把時間戳聚集索引的主鍵的一部分,我認爲如果時間戳是主鍵的一部分,插入到表中的數據已經按時間戳字段順序寫入磁盤。此外,我認爲這改善了我的查詢了很多,但我不確定這是否有幫助。

table has 3-4 million+ rows. 
timestamp field never changed. 
I use mysql 5.6.11 

Anothet的一點是:如果這是提高我的查詢,最好是使用時間戳或日期時間(5字節在MySQL 5.6)(在MySQL 5.6 4字節)?

回答

4

1)如果時間戳值是唯一你可以把它的主鍵。如果沒有,反正在時間戳列創建索引,因爲你經常在「where」中使用它。使用BETWEEN子句

2)看起來更自然在這裏。我建議你使用TREE索引(默認索引類型)而不是HASH。

3)當時間戳列索引,你不需要通過調用順序 - 它已經被排序。 (當然,如果你的索引是TREE而不是HASH)。

4)整數UNIX_TIMESTAMP既大於從存儲器使用側和性能側日期時間更好 - 比較日期的比較比整數更復雜的操作。上索引字段

在搜索數據需要O(日誌(行))樹查找。整數比較是O(1),日期比較是O(date_string_length)。所以,不同的是(樹查找的數量)*(difference_comparison)= O(date_string_length)/ O(1))* O(日誌(行))= O(date_string_length)* O(日誌(行))

4

四百萬行不是很大。

數據類型datetime和時間戳之間的一個字節的區別是最後件事你應該在這兩個數據類型之間進行選擇考慮。 Review their specs

製作時間戳部分您的主鍵是一個糟糕的主意。考慮在SQL數據庫中查看主鍵的含義。

在您的時間戳列上放置一個索引。獲取執行計劃,並將其粘貼到您的問題中。確定您的中位數查詢性能,並將粘貼也納入您的問題。

從索引400萬行的表我的臺式電腦上返回單日的行耗時2ms。 (它返回大約8000行。)

相關問題