【MySQL】mysql中不推薦使用uuid或者雪花id作為主鍵的原因以及差異化對比

文章目錄

      • 前言
      • 什么是UUID?
      • 什么是雪花ID?
      • 什么是MySql自增ID?
      • 優缺點對比
        • UUID:
          • 優點
            • 1.全球唯一性
            • 2.無需數據庫支持
          • 缺點
            • 1.存儲空間大
            • 2.索引效率低
            • 3.查詢效率低
        • 雪花ID:
          • 優點
            • 1.分布式環境下唯一性
          • 缺點
            • 1.依賴于機器時鐘
            • 2.存儲空間較大
            • 3.查詢效率低
        • MYSQL自增:
          • 優點
            • 1.簡單易用
            • 2.唯一性
            • 3.效率高
            • 4.索引效率高
          • 缺點
            • 1.不適用于分布式系統
            • 2.不適用于需要保密的場景
            • 3.查詢效率低
      • 應用場景
        • UUID應用場景
          • 1.分布式系統
          • 2.高并發環境
          • 3.需要保密的場景
        • 雪花ID應用場景
          • 1.分布式系統
          • 2.高并發環境
        • MySQL自增ID應用場景
          • 1.單機系統
          • 2.高效查詢
          • 3.索引效率高
      • 總結
      • 寫在最后

579a429daf314744b995f37351b46548

前言

在數據庫設計中,選擇適當的主鍵類型對于數據的存儲和查詢效率至關重要。在MySQL中,有些開發者傾向于使用UUID(Universally Unique Identifier)或者雪花ID作為主鍵,以確保數據的唯一性。然而,這種做法并不總是推薦的,因為它們在性能、存儲空間和索引效率等方面存在一些問題。本文將探討在MySQL中不推薦使用UUID或者雪花ID作為主鍵的原因,并與其他主鍵類型進行差異化對比。


什么是UUID?

UUID(Universally Unique Identifier)是一種標識符,用于在計算機系統中唯一地標識實體。它是一個128位的數字,通常以32個十六進制數字的形式表示,中間用連字符分隔。UUID的生成算法保證了在理論上不同計算機和不同時間生成的UUID都是唯一的。

UUID的唯一性和廣泛應用使得它在分布式系統、數據庫、網絡通信等領域得到廣泛使用。它可以用于標識數據庫記錄、文件、消息、會話等各種實體,確保它們在不同的系統和時間下都能夠被唯一標識。


什么是雪花ID?

雪花ID(Snowflake ID)是一種分布式唯一ID生成算法,由Twitter公司開發。它的設計目標是在分布式系統中生成全局唯一的ID,以解決傳統自增ID在分布式環境下可能出現的沖突和性能瓶頸問題。

雪花ID的結構如下:

  1. 符號位(1位):始終為0,表示正數。
  2. 時間戳(41位):記錄生成ID的時間戳,精確到毫秒級。
  3. 數據中心ID(5位):用于標識數據中心,最多支持32個數據中心。
  4. 機器ID(5位):用于標識機器,最多支持每個數據中心32臺機器。
  5. 序列號(12位):每個節點在同一毫秒內生成的序列號,最多支持每毫秒生成4096個ID。

通過將時間戳、數據中心ID、機器ID和序列號組合在一起,雪花ID可以在分布式系統中生成全局唯一的ID。由于時間戳占據了較高的位數,所以雪花ID生成的ID是遞增的,可以保證在一定程度上的有序性。


什么是MySql自增ID?

MySQL自增ID是一種由MySQL數據庫管理系統提供的主鍵生成機制。它通過自動遞增的方式為每條插入的記錄生成一個唯一的ID值,用于標識該記錄在表中的唯一性。

在MySQL中,自增ID通常與整數類型的列(如INT或BIGINT)結合使用。當插入一條新記錄時,MySQL會自動為該列生成一個唯一的ID值,下一次插入時會自動遞增。這樣可以確保每條記錄都有一個唯一的標識符,方便進行數據的查找、更新和刪除操作。


優缺點對比

UUID:
優點
1.全球唯一性

? UUID在全球范圍內保證了唯一性,不會出現重復的情況。

2.無需數據庫支持

? UUID的生成不依賴于數據庫,可以在應用層生成。

缺點
1.存儲空間大

? UUID占用的存儲空間較大,通常為36個字符,如果作為主鍵,會占用更多的存儲空間。

2.索引效率低

? UUID是隨機生成的,不具有順序性,導致索引效率較低。

3.查詢效率低

? 由于索引效率低,查詢效率也會受到影響。

雪花ID:
優點
1.分布式環境下唯一性

? 雪花ID在分布式系統中生成唯一的ID,可以滿足分布式環境下的需求。

缺點
1.依賴于機器時鐘

? 雪花ID的生成依賴于機器的時鐘,如果時鐘回撥或者時鐘不同步,可能會導致生成的ID不唯一。

2.存儲空間較大

? 雪花ID占用的存儲空間較大,通常為64位,如果作為主鍵,會占用更多的存儲空間。

3.查詢效率低

? 由于雪花ID是隨機生成的,不具有順序性,導致索引效率較低。

MYSQL自增:
優點
1.簡單易用

? MySQL自增ID的生成由數據庫自動完成,無需額外的代碼邏輯。

2.唯一性

? 自增ID保證了每條記錄都有一個唯一的標識符。

3.效率高

? 自增ID是按順序遞增的,可以提高插入和查詢的效率。

4.索引效率高

? 自增ID可以作為主鍵或索引列,提高查詢效率。

缺點
1.不適用于分布式系統

? 在分布式環境下,多個節點生成的自增ID可能會沖突,需要額外的處理機制。

2.不適用于需要保密的場景

? 自增ID的遞增規律可能暴露系統的使用情況,不適用于需要保密的業務場景。

3.查詢效率低

? 由于雪花ID是隨機生成的,不具有順序性,導致索引效率較低。

綜上所述,雖然UUID和雪花ID在某些場景下具有唯一性和分布式支持的優點,但由于存儲空間大、索引效率低等缺點,以及不適用于分布式和保密場景,不推薦將它們作為主鍵。相比之下,MySQL自增ID具有簡單易用、唯一性、效率高和索引效率高等優點,適用于大多數場景,因此推薦使用自增ID作為主鍵。


應用場景

UUID應用場景
1.分布式系統

? 由于UUID的全球唯一性,可以在分布式系統中生成唯一的標識符,避免沖突。

2.高并發環境

? UUID的生成不依賴于數據庫,可以在應用層生成,減少數據庫的壓力。

3.需要保密的場景

? UUID是隨機生成的,不具有遞增規律,適用于需要保密的業務場景。

雪花ID應用場景
1.分布式系統

? 雪花ID可以在分布式系統中生成唯一的ID,滿足分布式環境下的需求。

2.高并發環境

? 雪花ID的生成不依賴于數據庫,可以在應用層生成,減少數據庫的壓力。

MySQL自增ID應用場景
1.單機系統

? MySQL自增ID適用于單機系統,由數據庫自動生成,簡單易用。

2.高效查詢

? 自增ID是按順序遞增的,可以提高插入和查詢的效率。

3.索引效率高

? 自增ID可以作為主鍵或索引列,提高查詢效率。

綜上所述,UUID適用于分布式系統和需要保密的場景,雪花ID適用于分布式系統和高并發環境,MySQL自增ID適用于單機系統和高效查詢的場景。根據具體的業務需求和系統架構,選擇合適的主鍵類型。


總結

選擇適當的主鍵類型對于數據庫的性能和可擴展性至關重要。

在MySQL中,使用自增整數作為主鍵是一種常見的做法,因為它具有較小的存儲空間、高效的索引和自動增長的特性。

相比之下,使用UUID或者雪花ID作為主鍵可能會導致性能下降、存儲空間浪費和索引效率降低等問題。

然而,具體選擇何種主鍵類型還是要根據具體的業務需求和數據特點來決定。

通過本文的介紹和對比,希望讀者能夠更好地理解在MySQL中不推薦使用UUID或者雪花ID作為主鍵的原因,并能夠根據實際情況做出明智的選擇。


寫在最后

感謝您的支持和鼓勵! 😊🙏

如果大家對相關文章感興趣,可以關注公眾號"架構殿堂",會持續更新AIGC,java基礎面試題, netty, spring boot, spring cloud等系列文章,一系列干貨隨時送達!

csdn-end

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165754.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165754.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qml PathView使用介紹

PathView 是 QML 的一個強大的元素,它能夠在任意路徑上布局和滾動項目。這使得創建復雜的滾動視圖和項目動畫變得相對更簡單。 以下是 PathView 的一些主要特性: 路徑定義: PathView 根據 Path 元素定義的路徑布局項目。路徑可以是簡單的直線,復雜的曲線,或者包含多個不同…

IP 代理的基礎知識有哪些?

本文將介紹流冠IP代理的基礎知識,幫助您了解IP代理的概念、類型、作用、設置方法和注意事項。 一、IP代理的概念 IP代理是一種網絡代理服務,它通過代理服務器幫助用戶訪問互聯網,并將用戶的請求轉發到目標網站,同時將目標網站的響…

手寫工作流設計模式,針對常見的工作流步驟流轉,減少過多的if/else,提升編程思維

需求 這一年下來,寫兩次工作流流轉,總結下經驗。 第一次寫的時候,只找到用模版設計模式包裹一下,每個方法都做隔離,但是在具體分支實現的時候,if/else 滿屏分,而且因為要針對不同情況&#xff…

微信小程序實現類似Vue中的computed、watch功能

微信小程序實現類似Vue中的computed、watch功能 構建npm使用 構建npm 創建包管理器 進入小程序后,打開終端,點擊頂部“視圖” - “終端” 新建終端 使用 npm init -y初始化包管理器,生成一個package.json文件 安裝 npm 包 npm install --…

Java Web 實戰 21 - 用 Servlet 實現一個Hello World

用 Servlet 來寫一個 Hello World~ 一 . 基本部署方式1.1 創建 Servlet 項目1.2 引入依賴1.3 創建目錄1.4 編寫代碼繼承 HttpServlet重寫 doGet 方法刪除 super 方法加上 WebServlet 注解寫業務邏輯 1.5 打包1.6 部署1.7 驗證1.8 小結 二 . 更方便的部署方式2.1 Smart Tomcat 的…

【docker】安裝redis和mysql生產實戰

docker安裝諸如redis,mysql等程序非常方便,但是如果不是為了學習,生產環境的部署還是要注意很多問題的 mysql docker pull mysql:5.7mkdir -p /usr/docker/mysql/{conf,logs,data}docker run -d -p 3306:3306 --privilege

ORA-28003: password verification for the specified password failed,取消oracl密碼復雜度

自己在測試環境想要使自己的Oracle數據庫用戶使用簡單的密碼方便測試,結果指定密碼的密碼驗證失敗 SQL> alter user zzw identified by zzw; alter user zzw identified by zzw * ERROR at line 1: ORA-28003: password verification for the specified password…

本地部署 ComfyUI

本地部署 ComfyUI ComfyUI 介紹ComfyUI Github 地址部署 ComfyUI配置模型地址 or 下載模型啟動 ComfyUI訪問 ComfyUI ComfyUI 介紹 最強大、模塊化的穩定擴散 GUI 和后端。 該用戶界面將允許您使用基于圖形/節點/流程圖的界面設計和執行高級穩定擴散管道。 ComfyUI Github 地…

用戶運營常用的ChatGPT通用提示詞模板

如何建立和完善用戶運營體系,提高用戶滿意度和忠誠度? 如何制定有效的用戶獲取和留存策略,提高用戶生命周期價值? 如何運用多種渠道和平臺進行用戶運營,提高用戶參與度和互動性? 如何建立和維護用戶社群…

第五天 用Python批量處理Excel文件,實現自動化辦公

用Python批量處理Excel文件,實現自動化辦公 一、具體需求 有以下N個表,每個表的結構一樣,如下: 需要把所有表數據匯總,把每個人的得分、積分分別加起來,然后按總積分排名,總積分一致時&#xff…

小程序可拖拽按鈕

你有沒有遇到過在頁面中有一個固定在某個位置的按鈕,永遠的擋住了你想要看的區域? 在小程序的列表頁面中,常常會有一個提報的入口固定在右下角,如果這個按鈕不可拖動的話,可能會擋住下面的事件,讓用戶操作起…

云端導覽,數字互動 | 拓世法寶AI數字人一體機助力全新旅游時代

《中國旅行消費趨勢洞察白皮書(2023版)》顯示,消費者旅行習慣已從“到此一游”變為“深度在地”,更強調在旅游中充實自我、學習新知識。 (《中國旅行消費趨勢洞察白皮書(2023版》截圖) 從這些資…

C++標準模板(STL)- 類型支持 (類型修改,從給定類型移除引用,std::remove_reference)

類型特性 類型特性定義一個編譯時基于模板的結構&#xff0c;以查詢或修改類型的屬性。 試圖特化定義于 <type_traits> 頭文件的模板導致未定義行為&#xff0c;除了 std::common_type 可依照其所描述特化。 定義于<type_traits>頭文件的模板可以用不完整類型實例…

Springboot整合MybatisPlus及分頁功能

1 引入pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.7.14</version> </dependency> <dependency><groupId>com.baomidou</groupId><a…

【Vue】Vue3 配置全局 scss 變量

variables.scss $color: #0c8ce9;vite.config.ts // 全局css變量css: {preprocessorOptions: {scss: {additionalData: import "/styles/variables.scss";,},},},.vue 文件使用

讀書筆記:彼得·德魯克《認識管理》第33章 管理者與管理科學

一、章節內容概述 把管理科學的潛力轉變為績效&#xff0c;主要取決于管理者。要做到這一點&#xff0c;管理者必須理解管理科學是什么以及能夠做什么。管理者必須明白&#xff0c;管理科學固有的特殊局限性在很大程度上源于自身的起源和歷史。但最重要的是&#xff0c;管理者…

Java大型電商項目——品優購(一)

視頻教程&#xff1a;【黑馬程序員】Java大型電商項目—品優購【配套源碼筆記】_嗶哩嗶哩_bilibili源碼下載&#xff1a; 鏈接&#xff1a;https://pan.baidu.com/s/1fECz5In_XCB-aW6ed6ZTbA 提取碼&#xff1a;27xa 技術選型&#xff1a; 后端框架&#xff1a;SpringSprin…

多功能回饋式交流電子負載的應用

多功能回饋式交流電子負載是用于模擬和測試電源、電池等電子設備的負載工具。它具有多種應用&#xff0c;可以用于測試和評估各種類型的電源&#xff0c;包括直流電源和交流電源。它可以模擬各種負載條件&#xff0c;如恒定電流、恒定電壓和恒定功率&#xff0c;以驗證電源的性…

小葉子鋼琴智能陪練 助力打牢鋼琴基礎

孩子在練琴過程中&#xff0c;經常會出現錯音錯節奏&#xff0c;為了能夠幫助她更高效的練琴&#xff0c;最近開始使用智能鋼琴陪練工具——小葉子鋼琴智能陪練。 身邊也有很多朋友在用這款應用&#xff0c;它比較知名的功能就是三大練琴模式&#xff0c;也就是識譜模式、提升…

linux centos系統命令安裝

Zip unzip 命令安裝下載 centos 命令常用常用下載 https://rpmfind.net/linux/rpm2html/search.php?queryzip%28x86-64%29&submitSearch…&system&arch 在線安裝zip命令 Centos用yum安裝的話用下面的命令安裝 yum install -y unzip zipUbuntu的的系統可以用下…