uuid與性能低效的妥協處理

張貼日期:2014/5/19 上午 04:44:17

在一般的資料庫裡使用 流水(序列)號 當 主鍵 是常態現象,但在高級應用裡 流水號 可能會帶來洩密隱患,在ORACLE圈子還流行一個笑話"流水號是給新手練習的,主鍵用流水號根本沒出師,請用uuid/guid證明你是及格的",

在避免全局表裡面流水號與外鍵建模失誤帶來的大量流水號重複問題,有時必要使用uuid/guid.

但在mysql裡面,並沒有專用的欄位格式可以優化uuid/guid,一般都用char(36)欄位來存放,但用文字欄位當索引在mysql可是會死人的,尤其uuid/guid並不是循序的,

這裡提出一種在mysql裡面即可完成轉換成數字欄位的方法提供大家參考:

函數說明:

SELECT : mysql任意地方下選取查詢

CONV(處理內容,來源進位,目標進位)

REPLACE(處理內容,搜尋字串,取代成字串)

uuid() : 返回一個UUID字串

SELECT CONV(REPLACE(uuid(),'-',''),16,10)

輸出結果範例:

18446744073709551615

到此,UUID/GUID即可轉成等效數字存到int8(bigint,無號)欄位了,即可達到 非順序,不重複,速度夠快,容量較(cahr)小 的優點.