MySQL內置函數uuid和uuid_short

 

MySQL的uuid這個函數。簡要介紹一下。安全

用法多線程

 

簡單看到,這個值,每次執行都是不一樣的。函數

 

生成規則ui

第1 2 3 段是與時間有關的。線程

 

time_low、time_mid、time_high_and_version轉成16進制後分別對應第1 2 3段。這個時間是從1582-10-15 00:00:00.00到當前時間的100ns值。(實際上系統只能取到精確us,再乘以10)。因此你短期連續執行的話,比較可能只有第一個值在改,實際上1 2 3均可能會改變。server

第4段是你啓動這個MySQL後第一次執行select uuid()時的隨機數,每次重啓會改變。blog

第5段是mac值轉過來的,同一個機器多實例的通常相同。若是mac值獲取不到,則是一個隨機值。字符串

因此這個值能夠認爲是每次執行都不相同。而且不一樣實例之間也只有極微小几率重複。get

 

Uuid_shortit

 

         與uuid返回固定長度字符串不一樣, uuid_short的返回值是一個unsigned long long類型。MySQL啓動後第一次執行的值是經過server_id << 56 + server_start_time << 24來初始化。server_start_time單位是秒。 以後每次執行都加1。

         因爲每次加1都會加全局mutex鎖,所以多線程安全,能夠看成sequence來用,只是初始值有點大。

 

做爲Sequence

MySQL沒有Oracle那樣的sequence,在不是很精確的狀況下,能夠考慮上面提到的uuid_short。有一些不足:

一、初始值太大,沒法重設

二、存在一個問題是每次重啓後第一次執行的值不是重啓前的那個值+1

三、並且若是重啓在1s內完成,可能出現不單調遞增(雖然這個可能性微乎其微)。

相關文章
相關標籤/搜索