2012-05-26 67 views
4

我可以有一個自動增量id字段作爲我的主鍵或sha1哈希。使用自動增量ID或sha1散列的主鍵mysql?

我應該選擇哪一個?

在性能方面哪個更好?

+1

你應該選擇哪一個取決於你的應用。就性能而言,我會選擇不需要計算昂貴散列的選項。 – eggyal

+0

我的2表涉及一個sha1散列被存儲,涉及每一行,我問作爲varchar(40)列在2個表我認爲是比1 varchar(40)和2個int列更detrement。 – cgwebprojects

+0

@cgwebprojects 2 char(40)(不需要varchar)是80字節(取決於字符集)。 1個字符(40)和2個整數是48個字節。而且,索引在整數上比在char上要快(40)。 – Corbin

回答

1

幾乎肯定是一個自動遞增整數。創建速度更快,搜索速度更快,體積更小。舉個例子,如果你有另一個引用它的表。你想讓它通過一個整數主鍵或通過sha1散列來引用它嗎?一個整數會更有意義(以某種方式),並且它會更加有效(太多了!)。

+0

再次感謝!正如我在一張桌子上存放一個sha1,我不知道是否用相同的sha1將它連接到另一個,但是如果自動增量更好,那就這樣吧! – cgwebprojects

+0

自動遞增ID與通過sha1哈希鏈接相比更適合RDBMS的設計。積分ID很小,非常快速地索引和遞增,對於DB來說非常便宜。 sha1會做出更大更慢的指標,正如juergen d指出的那樣,它們很容易發生碰撞。 (他的回答實際上應該是可以接受的答案,因爲它涵蓋了我所做的一切+碰撞) – Corbin

+0

你能想象使用自動增量ID對數據庫進行分片嗎?其實不,你不知道;因爲Instragram已經通過了它:http://instagram-engineering.tumblr.com/post/10853187575/sharding-ids-at-instagram自動增量ID是可笑的縮放。 – mjsa

1

使用自動增量ID。

  • 一個ID不必生成只增加。
  • 散列更適合存儲密碼。
  • 您可以使用SHA哈希得到重複的密鑰。這個機會很小但是真實。
  • 一個ID更方便可讀
  • ID是一種插入歷史記錄。你知道最後插入了哪條記錄(最高ID)
+0

非常感謝你的朋友:) – cgwebprojects

+2

你可能會很快達到可以存儲在一個整數的限制,比發現碰撞與SHA哈希。再次遇到陰影數據庫時,自動增量會變得很痛苦。 – mjsa

18

有幾個應用程序驅動的情況下,你想使用一個全球唯一的ID(UUID/GUID):採用分片策略

  1. 你希望(或者)擴展寫入。您不希望分片節點重複鍵
  2. 你想成爲能夠安全端口數據從一個節點到另一個保存鍵。如果您想保持外鍵關係,這是至關重要的。
  3. 您的應用程序也可以用來離線家用銷售家用維修等),其中離線應用週期性地與「真理之源」同步。您希望這些離線密鑰是唯一的,無需進行遠程呼叫。否則,您需要制定策略來重新整理密鑰和關係。採用自動增量策略並根據您使用的RDBMS,這可能是一項不重要的任務。

如果你沒有從上面或類似的東西用例,您可以使用自動遞增的ID,如果讓你舒服;但是,您可能仍然要考慮UUID/GUID

權衡:

有很多持有約UUID/GUID鍵的速度/大小的意見。在一天結束時,這是一種折衷,有很多方法可以通過數據庫獲得或減少速度速度。理想情況下,您希望將索引存儲在RAM中以儘可能快;然而,這是一個權衡,你必須權衡其他考慮因素。

關於UUID/GUID其他注意事項:

  1. 許多RDBMS可以產生UUID。
  2. 您也可以通過您的application生成UUID(您並未綁定到要生成的RDBMS)。
  3. 開發人員/測試人員可以輕鬆地將數據從環境移植到環境,並使應用程序按預期工作。這是一個經常被忽視的用例;然而,這是使用UUID/GUID策略的更強有力的例子之一。
  4. 有些數據庫針對脫機使用進行了優化(CouchDB),其中UUID就是您所得到的。