UUID(通用唯一識別符號)是一種用於標識資訊的標準化方法。UUID版本4是最常見的UUID版本,它基於隨機數生成。
UUID 版本 4 是什麼?
UUID 是通用唯一識別符號的縮寫,是一個 128 位識別符號,表示為由破折號分隔的字母和數字組成的 32 個字元序列,格式為 8-4-4-4-12。
UUID 版本 4 的結構(例如“123e4567-e89b-12d3-a456–426655440000”)顯示了其十六進位制值,每個字元的範圍從“1”到“f”。該唯一識別符號可以作為字串或 16 位元組儲存在資料庫中。
無論是完全隨機生成還是透過偽隨機生成器生成,UUID 版本 4 都保持其卓越的唯一性。
3.26*10^6 UUID 的樣本有 99.99% 的機會沒有任何重複項
UUID 版本 7 是什麼?
與 UUID v4 類似,UUID v7 是一個 128 位識別符號,表示為 32 個字元的字母和數字序列,格式為 8–4–4–4–12。
UUID v7 的顯著特徵在於其作為時間排序 UUID 的本質,在最高有效 48 位中以毫秒精度編碼 Unix 時間戳。
與 UUID 格式一致,4 位表示 UUID 版本,2 位表示變體。其餘 74 位是隨機生成的,從而保證了該識別符號的唯一性。
為什麼使用 UUID 而不是順序 ID?
讓我們概述一下 UUID 與順序 ID 相比的優缺點:
UUID 優點:
- 1.低衝突機率:由於其結構,UUID 的衝突機率非常低,允許伺服器在插入之前為記錄生成 ID。
- 2.適合分散式系統: UUID非常適合分散式資料庫和系統,因為它們可以在伺服器上獨立生成。
- 3.增強的安全性: UUID 透過保持記錄匿名、防止使用者(或惡意實體)推斷有關記錄建立順序的資訊來提高資料庫安全性。
UUID 缺點:
- 1.增加儲存空間:與傳統ID(例如,INT 為4 位元組或BIGINT 為8 位元組)相比,UUID 佔用更多儲存空間(16 位元組)。
- 2.手動資料輸入困難: UUID 的複雜性使得手動資料輸入具有挑戰性。
- 3.降低查詢效能:較大的 UUID 大小會導致查詢效能降低,因為增加的記錄大小會導致每個資料庫頁儲存的記錄減少,從而導致更多的 I/O 操作並降低整體效能。
- 4.索引和資料碎片: UUID 會導致索引和資料碎片,影響資料庫效率。關於這一點有必要進一步討論。
UUID v4與UUID v7 比較
索引:
- UUID v4 ID 彼此之間缺乏相關性,因為它們由於其完全隨機的性質而表現出較差的索引區域性性。因此,新生成的 UUID v4 的十六進位制值可能小於舊的 UUID v4 的十六進位制值。
- UUID v7 由於其基於時間的性質而本質上是排序的。這生成的值幾乎是連續的,一致地插入到最後一頁的末尾(如果所有伺服器都同步)。這一特性有效地消除了索引區域性性問題。
資料庫快取:
- UUID v4 問題是ID非常隨機,緩衝池很快就被填滿,每條記錄都可以位於不同的頁面上,因此資料庫引擎將去獲取它,如果緩衝池已滿,它應該寫一頁或更多頁到磁碟以釋放一些空間,下一條記錄可能會或可能不會在我們剛剛寫入的同一頁中,並且此迴圈將繼續進行。
- 在 UUID v7 或序列整數的情況下不會發生這種情況,因為記錄的 ID 被授予按遞增順序。因此,當達到頁數限制時,記錄將新增到最後一頁。資料庫引擎將建立一個新頁面,可能會將舊頁面寫入磁碟,也可能等待緩衝池被填滿並只寫入 WAL。