2011-12-16 107 views
4

一個使用GUID的Jeff Atwood's缺點是,它是GUID +自動增量ID =性能較差?

Cumbersome to debug (where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}') 

我同意。我在想,現在16字節的ID不再被認爲是一項巨大的工作,16字節+4字節的ID是一種實際的妥協?

您可以應用聚簇索引,並對自動增量ID執行大部分串行操作(讀取:優化)。合併,分銷或其他大型企業將使用GUID作爲其主要主力。

那麼......那裏的任何人都試圖混合兩個世界的最佳?你的承諾的結果是什麼?當然,有一個PK(GUID)在另一個索引字段旁邊吃掉所有索引空間的問題(自動增量ID),所以我想這種權衡可能很微妙和/或特定於一個非常狹窄的場景。

注意:this question已經解決了此問題,但從管理參照完整性的角度來看。我只是好奇於如何將PK/UK配置組合在桌面上,以及它們對性能和規模的各種影響。從本質上來說,最好是將GUID用作PK,並將自動增量用作非唯一索引?將它們作爲一對獨特的鑰匙是否更好?

謝謝你的時間。

+0

+1這是一個很好的問題 – Matt 2011-12-16 16:52:59

回答

0

自動遞增ID的問題是插入性能:如果插入數千行,則意味着在數據庫級別有數千個自動遞增。另一方面,索引插入不是一個問題,哈希方法確保了一個良好的分佈。

例如,您可以使用20位數的隨機數作爲主鍵並僅使用它:不需要GUID!

2

索引int便宜且實用。對GUID進行索引是昂貴的(並且面向網絡的前端是安全的;沒有人能夠通過GUID來循環以從表中請求單獨的行)。 SEQ GUID s確實在大量插入操作後提供(相對)快速的索引構建,但消除了大部分可爲公共訪問提供一定安全性的「隨機性」。

從這個discussion on SQL Authority,從int最終進展 - >bigint - >​​是一種罕見的一個,直到它的時間要求不應該被考慮在內。到目前爲止,用於啓動一個新項目的最安全和最易於訪問的方法是使用bigint PK AUTO_INCR,將GUID用作非索引的非順序字段,專門用於在數據庫整個生命週期中分片或合併分片。它在速度方面需要一定的投入,但直到有足夠的行才能真正關注跨實例唯一性之類的事情時,纔會感受到這些影響。