2009-02-04 50 views
11

我的工作將要實施的十六進制值作爲業務鍵(除了自動增量字段作爲主鍵)類似於在Gmail中看到的URL ID的應用。我將爲該列添加一個唯一的約束,並且最初考慮將該值存儲爲bigint以避開搜索varchar字段,但是想知道如果該字段是唯一的,那麼這是否是必需的。MySQL的性能VS獨特BIGINT

內部連接將使用自動遞增現場完成和十六進制值將在where子句過濾中使用。

簡單地將值存儲爲varchar(x),或者將char(x)存儲在額外的工作中,以執行向和從十六進制的轉換以將值存儲爲整數在數據庫中?這值得額外的複雜性嗎?

我做了少量的行(50K)的快速測試和有類似的搜索結果的時間。如果存在很大的性能問題,它會是線性的還是指數級的?

我使用InnoDB作爲引擎。

回答

5

您的十六進制值是GUID嗎?儘管我過去擔心諸如索引這樣的長項目的表現,但我發現在現代數據庫上,甚至數百萬條記錄的性能差異也是微不足道的。

一個潛在的更大的問題是所述存儲器,所述索引消耗(16字節對4字節整型,例如),但對我控制我可以分配用於該服務器。只要索引可以在內存中,我發現其他操作的開銷更大,索引元素的大小沒有顯着差異。好處在於,如果您使用GUID,您可以獲得創建記錄的服務器獨立性,並且可以更靈活地合併多個服務器上的數據(這是我關心的,因爲我們的系統會彙集來自子系統的數據)。

有,似乎備份我懷疑這篇文章的圖:Myths, GUID vs Autoincrement

1

從UUID(Java的實現)所產生的十六進制值;它被散列並截斷爲較小的長度(可能是16個字符)。算法仍在討論中(目前是SHA)。我看到的以十六進制和整數形式存儲值的優點是,如果我們需要增加大小(在16個字符處我沒有看到這個應用程序發生的情況),我們可以簡單地增加截斷的長度並保留舊值而不用擔心的碰撞。轉換爲整數值不會很好地工作。

的原因截斷VS只需使用GUID/UUID是僅僅爲了使網址和API(這是它們將被使用)更加友好。

+1

就個人而言,我真的盡力避免將用戶暴露給用戶界面中的GUID。即使是一個URL線。但是,我會建議在內部使用它們,並通過使用會話或使用特定的代碼來截斷它們以顯示*。這樣&item = 1是我展示的第一個項目...我在內部拉* GUID *。 – Godeke 2009-02-05 00:08:51

1

其他所有條件都相同,保持數據更小會使其運行更快。這主要是因爲它會需要更少的空間,磁盤,以便減少I/O,內存少需要保存索引,等等等等50K行是不夠的,注意到雖然...