2009-02-13 33 views
29

這是我能想出的UUID()產生一個MySQL GUID/UUID轉換爲二進制的最佳方法(16):存儲MySQL的GUID/UUID的

UNHEX(REPLACE(UUID(),'-','')) 

然後將其存儲在一個BINARY(16)

這樣做我應該知道有什麼影響嗎?

+0

是的,但是當我依賴於應用程序自己的guid生成和unhexing並替換(在我的情況下,.NET)時,我可以獲得邊際性能改進 – nawfal 2012-06-28 00:08:53

+0

@nawfal,may對OP來說是一個傾斜的答案,但是真的希望看到你的評論充滿了實例。 – 2017-03-06 19:27:50

回答

8

沒有太多的影響。它會減慢查詢的速度,但您幾乎不會注意到它。

UNIQUEIDENTIFIER內部無論如何存儲爲​​。

如果您打算將二進制文件加載到客戶端並解析它,請注意bit order,它可能具有比初始NEWID()更多的其他字符串表示形式。

OracleSYS_GUID()函數很容易出現此問題,將其轉換爲字符串會在客戶端和服務器上給出不同的結果。

+0

我會添加到評論我挖了一些材料。在MySQL中關於UUID的考慮應該考慮性能以及唯一性。雖然稍微老一點,但一個有趣的性能測試在這裏:http://kccoder.com/mysql/uuid-vs-int-insert-performance/ - 這表明了MySQL的敏感點,並確保MySQL中的「UNIQUE」值。我相信有一些改進,但是如果你有機會,應該考慮到領域的大小,包含的索引的結構等。 BINARY(16)/ CHAR(16)似乎是要走的路。 – 2016-02-04 10:47:31

-4

我將散列成一個8字節的整數,並且使用低碰撞的高效率的單向散列算法等MurmurHash64A存儲整數。這使用了很少的空間,並且可以進行索引和/或分區。有一個SourceForge項目,包括MemSQL的MemSQL功能(http://forge.mysql.com/projects/project.php?id=250),可能包括MurmurHash64A,因爲Memchached使用它,但我不知道。或者看看這個針對mySQL的FNV的實現:http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/