成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

被追著問UUID和自增ID做主鍵哪個好,為什么?

開發 前端
基于隨機數的 UUID 是根據隨機數或偽隨機數生成的。該版本的 UUID 使用隨機數生成器生成,保證了生成的 UUID 具有極佳的唯一性。然而,由于其基于隨機數,因此不太適用于數據量特別大的場景。

之前無意間看到群友討論到用什么做主鍵比較好

圖片圖片

圖片圖片

圖片圖片

其實 UUID 和自增主鍵 ID 是常用于數據庫主鍵的兩種方式,各自具有獨特的優缺點。

UUID

UUID 是一個由 128 位組成的唯一標識符,通常以字符串形式表示。它可以通過不同的算法生成,例如基于時間戳的 UUID(version 1)和基于隨機數的 UUID(version 4)等。

UUID 的優點

  • 全局唯一性:通過不同算法生成,幾乎能夠保證在全球范圍內的唯一性,從而避免了多臺機器之間可能發生的主鍵沖突問題。
  • 不可預測性:隨機生成的 UUID 很難被猜測,因此在需要保密性的應用場景下非常適用。
  • 分布式應用:由于可以在不同的機器上生成 UUID,因此可以被廣泛應用于分布式系統中。

然而,UUID 作為主鍵 ID 也存在一些缺點:

  • 存儲空間較大:UUID 通常以字符串形式存儲,占用的存儲空間較大。
  • 不適合范圍查詢:由于不是自增的,不支持范圍查詢。新生成的 UUID 可能會插入到已有數據的中間位置,導致范圍查詢時出現數據重復或漏數據的情況。
  • 不方便展示:UUID 通常比較長,且沒有明確的業務含義,因此不太適合在系統間或前臺頁面進行展示。
  • 查詢效率低下:

在 UUID 列上創建索引會導致索引大小增加,從而影響緩存命中率,增加磁盤 I/O 需求,同時也增加了查詢時的內存開銷。

當使用 UUID 進行排序時,新生成的 UUID 通常會插入到葉子節點的中間位置,導致 B+樹的頻繁分裂和平衡操作,進而影響查詢性能。

自增 ID

在 MySQL 中,可以通過設置 AUTO_INCREMENT 屬性實現 ID 的自增長,通常用于作為主鍵 ID。

使用自增 ID 作為主鍵的好處包括:

  • 存儲空間節省:ID 為數字,占用的位數比 UUID 小得多,因此在存儲空間上更加節省。
  • 查詢效率高:ID 遞增,利于 B+Tree 索引的查詢效率提高。
  • 方便展示:ID 較短,方便在系統間或前臺頁面進行展示。
  • 分頁方便:ID 連續自增,有利于解決深度分頁問題。

然而,使用自增主鍵也存在一些問題:

  • 分庫分表困難:在分庫分表時,無法依賴單一表的自增主鍵,可能導致沖突問題。
  • 可預測性:由于 ID 是順序自增的,因此具有一定可預測性,存在一定的安全風險。
  • 可能用盡:自增 ID 可能是 int、bigint 等,但它們都有范圍限制,可能會用盡。
  • 性能問題:在數據遷移期間,如果使用自增主鍵,數據庫可能會產生額外的性能開銷。這可能是由于重新計算主鍵值或更新相關索引所致。這可能會導致數據遷移過程變慢。

到底什么是 UUID,它能保證唯一嗎?

UUID(Universally Unique Identifier)是一種全局唯一標識符,用于在同一時空中的各臺機器上保證唯一性。

UUID 的生成基于特定算法,通常使用隨機數生成器或基于時間戳的方式。生成的 UUID 以 32 位 16 進制數表示,總共 128 位(標準 UUID 格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,共 32 個字符)。

由于 UUID 是由 MAC 地址、時間戳、隨機數等信息生成的,因此具有極高的唯一性,幾乎不可能重復。但在實際實現中,UUID 有多種版本,它們的唯一性指標也有所不同。

UUID 的具體實現版本包括基于時間的 UUID V1 和基于隨機數的 UUID V4 等。

在 Java 中,java.util.UUID生成的 UUID 包括 V3 和 V4 兩種版本。

圖片圖片

UUID 的優缺點

UUID 的優點在于其性能較高,不依賴網絡,可以在本地生成,并且使用起來相對簡單。

然而,UUID 也存在兩個明顯的缺點:

  1. 長度過長:UUID 通常由 32 位 16 進制數字組成,因此長度較長。例如,對于類似"550e8400-e29b-41d4-a716-446655440000"的字符串,幾乎沒有任何程序員能夠直觀理解其含義。
  2. 缺乏含義:UUID 是隨機生成的,因此缺乏任何業務或語義上的含義。一旦將其用作全局唯一標識,可能導致在日后的問題排查和開發調試過程中遇到較大困難。

各個版本實現

  • V1. 基于時間戳的 UUID

基于時間戳的 UUID 是通過計算當前時間戳、隨機數和機器 MAC 地址得到的。由于算法中使用了 MAC 地址,這個版本的 UUID 能夠確保在全球范圍內的唯一性。然而,使用 MAC 地址也帶來了安全性問題,因此這個版本的 UUID 受到了批評。如果應用只在局域網中使用,也可以使用一種簡化的算法,以 IP 地址代替 MAC 地址。

  • V2. DCE(Distributed Computing Environment)安全的 UUID

這個版本的 UUID 算法與基于時間戳的 UUID 相同,但會將時間戳的前 4 位替換為 POSIX 的 UID 或 GID。然而,實際中較少使用這個版本的 UUID。

  • V3. 基于名稱空間的 UUID(MD5)

基于名稱空間的 UUID 通過計算名稱和名稱空間的 MD5 散列值得到。這個版本的 UUID 保證了以下幾點:在相同名稱空間中,不同名稱生成的 UUID 具有唯一性;不同名稱空間中的 UUID 是唯一的;在相同名稱空間中,相同名稱生成的 UUID 是重復的。

  • V4. 基于隨機數的 UUID

基于隨機數的 UUID 是根據隨機數或偽隨機數生成的。該版本的 UUID 使用隨機數生成器生成,保證了生成的 UUID 具有極佳的唯一性。然而,由于其基于隨機數,因此不太適用于數據量特別大的場景。

  • V5. 基于名稱空間的 UUID(SHA1)

與版本 3 的 UUID 算法相似,但使用 SHA1(Secure Hash Algorithm 1)算法進行散列值計算。

各版本 UUID 簡要總結如下:

Version 1 和 Version 2:

  • 基于時間戳和 MAC 地址,適合分布式計算環境,具有高度唯一性。

Version 3 和 Version 5:

  • 基于名稱空間,在一定范圍內是唯一的,可用于生成重復 UUID 的場景。

Version 4:

  • 簡單地基于隨機數生成,適合數據量不是特別大的場景,但可靠性較低。
責任編輯:武曉燕 來源: 碼上遇見你
相關推薦

2024-12-25 15:32:29

2024-10-24 09:22:30

2023-10-24 15:27:33

Mysql自增主鍵

2020-04-21 15:59:50

MySQL自增主鍵數據庫

2009-09-24 13:49:31

Hibernate自增

2020-08-31 11:20:53

MySQLuuidid

2023-12-26 01:09:28

MySQL存儲釋放鎖

2023-11-30 09:09:53

數據庫Java

2022-06-03 08:12:52

InnoDB插入MySQL

2022-07-03 22:00:49

MySQL自增值數據

2020-05-06 15:02:58

MySQL數據庫技術

2019-09-18 15:49:06

MySQL數據庫面試官

2022-11-08 19:30:52

DjangoID自增

2010-03-29 14:09:12

Oracle ID 自

2020-08-24 07:19:13

主鍵自增數據庫

2018-12-14 15:35:20

MySQL索引數據庫

2024-04-18 09:24:32

分布式ID分庫分表

2022-06-14 08:01:43

數據庫MySQL

2021-09-28 17:48:20

MySQL主鍵索引

2020-05-11 10:48:01

技術資訊
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 本道综合精品 | 天堂一区二区三区 | 亚洲另类春色偷拍在线观看 | 九色.com| 欧美电影网 | 91欧美激情一区二区三区成人 | 亚洲福利精品 | 精品亚洲91 | 免费精品视频 | 美国一级黄色片 | 日韩精品久久一区二区三区 | 日韩中文一区二区三区 | 亚洲狠狠 | 成人免费xxxxx在线视频 | 黄色免费网站在线看 | 影音先锋中文字幕在线观看 | 天天玩天天操天天干 | 一级黄片一级毛片 | 日韩一二区在线 | 一区二区三区视频免费观看 | 亚洲精品www久久久久久广东 | 欧美在线 | 午夜精品久久久久久不卡欧美一级 | 亚洲精品一区二区在线观看 | 亚洲视频一区二区三区 | 亚洲国产精品久久久久婷婷老年 | 先锋影音资源网站 | 久久久久亚洲国产| 久久久久国产精品一区 | 日本不卡视频在线播放 | 国产一二三区电影 | 一区不卡在线观看 | 国产精品不卡一区 | 国产精品资源在线 | a网站在线观看 | 国产98色在线 | h在线免费观看 | 欧美一级片在线播放 | 羞羞视频在线网站观看 | 久久久久久亚洲精品 | 午夜av在线 |