2013-04-20 131 views
8

我有一個UUID字符串,我想用作我的MySQL表主鍵,UUID是一個32個字符的十六進制字符串(「 - 」字符被剝離)。由於最好在數據庫中使用數字列(int)作爲主鍵,所以我想將其轉換爲整數,但不確定如何處理它。作爲MySQL表主鍵處理大型(UUID)的最佳方式

  1. 由於字符串(即UUID =「a822ff2bff02461db45ddcd10a2de0c2」)的尺寸,我需要分成多「子」這一點。
  2. 由於PHP_INT_MAX大小(最大0xFFFFFFFF),我現在在32位體系結構上運行PHP,因此在PHP內轉換它不起作用。我懷疑這會對MySQL造成同樣的限制。
  3. 我不喜歡多個主鍵作爲此修復的想法,我寧願使用字符串表示,即使這不是首選方法。

我可能會考慮這一切都是錯誤的,並不反對閱讀文檔,因此無論是示例還是建議閱讀作爲迴應都是可以接受的。

+0

另外要注意的是,這個ID字段將用於連接和選擇。 – 2013-04-20 17:04:58

回答

25

對於大多數情況下,最好將UUID/GUID存儲爲BINARY(16)。看到這些相關的StackOverflow問題:

轉換可以(也許應該)在MySQL,而不是PHP所以無論您使用的是32位PHP客戶端或64位完成無關緊要(雙關語意:P)

+0

這聽起來正是我一直在尋找的。 GUID/UUID不是由我生成的,它是從第三方來源提取的。它是獨一無二的,可以作爲主要關鍵。 @PaulProgrammer我也非常感謝您的快速回復,我已經爲您+1了。感謝您在這些答案中的幫助。 – 2013-04-20 18:06:38

+0

@Hazzit - 你知道將UUID作爲字符串綁定到MySQLi中的bind_param方法是否合法,並將其指向二進制(16)字段?我無法確定是否需要先進行任何轉換。 – nickdnk 2015-01-29 18:58:36

1

使用字符串類型,而不是整數。如果它解決了一個問題,那麼只有更好。

如果您真的關心查詢速度,請使用合成(自動增量)主鍵。您可以在UUID列上放置一個唯一的約束,並且僅使用一次來查找隨後用於您的連接的合成密鑰等。

+0

我在過去的項目中使用過字符串,我相信(在製作過程中)只會將數百萬條記錄作爲高數字,所以我不認爲這是一個很大的性能問題(使用字符串),我不太確定在使用字符串和數字字段時,性能受到影響的規模會有多大。根據規模,我不完全確定合成主鍵在數百萬條記錄(比如說1000萬條記錄)中是有利的。 – 2013-04-20 17:14:10

+0

所以你說的是沒有真正的方法來容易地打包/存儲這個數字表示,我的選項是字符串和字符串合成自動增量鍵。 – 2013-04-20 17:16:13

+0

這是一個問題,直到它是一個問題。生產質量數據庫(包括mysql)有非常聰明的索引算法來處理字符串查詢。如果你現在不關心性能,那麼爲什麼你在原始問題中對抗最大整數大小的牆? – PaulProgrammer 2013-04-20 17:18:35

0

它也取決於存儲引擎。 TokuDB應該處理所有這些問題。