2012-03-14 83 views
2

即使SQL表按ID排序,我的網站也會按DATE顯示帖子。由於ID的順序並不總是與DATE的順序相同,因此我使用ORDER BY 'DATE'運行查詢。SQL - 主鍵,聚簇索引,自動增量

SQL表舉例:

---------------------------- 
| ID | DATE    | 
---------------------------- 
| 1 | 2011-10-20 00:00:00 | 
| 2 | 2012-10-20 00:00:00 | 
| 3 | 2010-10-20 00:00:00 | 
| 4 | 2011-09-20 00:00:00 | 
---------------------------- 

To query I use: SELECT * FROM `table` ORDER BY 'DATE'; 

我的問題:

  1. 會受益的查詢性能,如果表中的聚簇索引或主鍵是DATE列?

  2. 是否有可能使ID列自動增量,當它不是主鍵?

我想要做的是使查詢儘可能快的(我想這將有可能通過使DATE簇索引或主鍵),而且還允許每個帖子都有一個唯一的自動增量ID。我試圖讓DATE成爲主鍵,但我得到一個錯誤,說「只能有一個自動列,並且它必須被定義爲一個鍵」。

+1

'ORDER BY'DATE''將不會對您的結果進行排序,因爲按照常量字符串DATE排序,而不是按DATE列的值進行排序。由於您在列名稱中使用保留字,因此您需要使用'''或反引號(使用'table'的方式)引用它。 – 2012-03-14 18:33:35

回答

3

我不會將日期定義爲主鍵,而是在該字段上添加索引。獨特的,如果需要。我相信有可能在非主鍵字段上有一個自動增量,但自己嘗試它會給你最好的答案!

< - 編輯 - >

爲了回答您的評論的問題,我不能說其是一個壞主意,但日期總是挑剔。有一次,您必須決定是否使用UTC或本地日期,預覽夏令時如何影響您的程序,預見在應用程序生命的某個時間是否有可能需要更新日期等等。我寧願忘記這一點,只用獨特的自動生成的密鑰。 如果確實要將日期作爲PK,則可以使用時間戳並避開第二個序列列。

我在techtarget.commade2mentor.com找到了更多關於日期的信息。

+0

因此,將聚合索引設置爲日期是個壞主意? – supercoolville 2012-03-14 20:42:04

+0

@supercoolville我在帖子中添加了我的答案,因爲它太長了:) – 2012-03-14 23:43:45

0

對於索引來說,如果進入它的值是無序的,那很好。不是強制性的但很好。既然它們是樹,如果索引只是一個自動增量列,那麼每次從索引中刪除索引時,最終會得到一個不平衡的樹,因爲它只會被添加到一個葉中,所以在保證新增數據時總是會失去平衡(直到索引頁面已滿)。

對於自動增量字段上的聚簇索引(Sybase,MS SQL和其他所有的主鍵默認情況下),執行相對頻繁的索引重建可能是一個好主意。我的理念是聚焦最常見的掃描。所以我可能會將我的主鍵設置爲ID列,但我會在DATE上進行聚類,因此當我執行諸如從表格中選擇日期時,或者選擇...按日期排序時,查詢會在讀取頁面時掃描連續的項目關閉磁盤。

相關問題