MySQL中, 自增主鍵和UUID作為主鍵有什么區別?

首先我們來看看, 存儲自增主鍵和uuid的數據類型

? ? ? ? 我們知道, mysql中作為主鍵的通常是int類型的數據, 這個 數據從第一條記錄開始, 從1開始主鍵往后遞增, 例如我有100條數據, 那么根據主鍵排序后, 里面的記錄從上往下一次就是1, 2, 3 ... 100, 但是UUID就不一樣了, UUID是根據特殊的算法, 來生成唯一的一個字符串, 他的長度高達128個比特位,?而標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (8-4-4-4-12), 每一個x都是?0-9 或?a-f?范圍內的一個十六進制的數字, 因此他需要使用字符串格式來進行存儲, 標準的uuid的長度是32個字符, 外加兩個短線, 也就是34個字符

? ? ? ? 在mysql中對int類型值的處理速度是比字符串的速度要快的, 因此在速度上, 是肯定比不過自增主鍵的, 我們在比較UUID, 然后對這些UUID進行一個排序的, 是一個字符一個字符的進行比較的, 例如有兩個UUID, 那么就是從第一個字符比較, 如果第一個字符相等, 就比較下一個字符的大小, 以此類推, 直到比較完了, 那么兩個字符串就想等, 如果存在字符的大小區別, 那么就根據不同的這個字符進行排序, 以此類推.

? ? ? ? 所以你是用UUID進行存儲, 那么相比于自增的主鍵, 那么你就要花費額外的空間來存儲這些UUID, 在插入主鍵或者是uuid的時候, 會有一個插入順序的問題, 對于主鍵, 如果你不指定主鍵的值, 然后給這個主鍵設置自增值, 那么在插入的時候, 就會按照最大主鍵值的下一位插入, 這個時候就會性能很高, 為什么這么說呢??

? ? ? ? 因為mysql底層是一個數據頁為一個基本的讀寫單元, 一個數據頁可以存放16kb的數據, 你可以理解為數據頁里面的記錄是一個鏈表, 假如此時你不是按主鍵自增的順序插入, 并且你插入的主鍵對應的數據頁剛好滿了裝不下了, 此時的話, 你就需要將一個頁拆分為兩頁, 這個就造成了不必要的性能消耗. 如果你按照自增的形式插入, 那么他們就會以此在最后一個數據頁里面插入, 如果不夠了, 就創建新的數據頁, 而不是將一個頁差分為兩個, 然后拷貝數據.? ?

? ? ? ? ?但是如果你是使用的UUID作為主鍵, 那么就沒有這個功能, 你的字符串id是有序的, 但是你不能保證, 你下一個生成的uuid, 就一定是最大的, 因此被分頁的可能性就會很高. 同時每一個主鍵的占用的空間大了, 那么一個數據頁裝的數據記錄也會變少, 頁面增多, 所以在對這些記錄進行操作, 將數據頁讀取到內存中的時候, 讀取的頁數頁隨之增多. io成本隨之增多.

? ? ? ? 在存儲和性能方面, 還是自增主鍵更勝一籌.

說了這么多仿佛都是UUID的缺點, 那UUID做主鍵就么沒有有點嗎?

? ? ? ? 有點肯定是有的?, 例如UUID的長度很長, 并且是隨機生成的, 他的主鍵的復雜性很高, 并且沒有規律, 你不能夠通過數據分析來預測下一個主鍵id是多少,這種不可預測性對于需要保密性的應用場景較為適用。

? ? ? ? 還有另外一種場景, 假如現在有這樣一個需求, 我需要將一個自增主鍵的表, 導入另外一個和當前表結構相同的表, 但是這個表已經存了很多數據, 這個時候我將其插入, 就會導入失敗, 因為兩個表前面幾部分的id是重合的, 因此會插入失敗. 同樣的當你去拆分數據庫的時候, 也可以很好的拆分, 并且避免id的重復導致數據的錯亂.

? ? ? ? 此時如果你使用的是UUID, 那么就可以避免這個問題.

總結:?

在MySQL中,使用自增主鍵(AUTO_INCREMENT)和UUID作為主鍵的主要區別體現在以下幾個方面:

  1. 唯一性
    • 自增主鍵:確保主鍵的唯一性,每次插入新行時,數據庫會自動為主鍵生成一個唯一的、比之前插入的最大主鍵值大1的整數值。
    • UUID:具有極高的唯一性,基于一定算法(如隨機數生成器或時間戳)生成,幾乎不可能重復。UUID由32位16進制數表示,共128位(標準的UUID格式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。
  2. 數據類型和存儲
    • 自增主鍵:只適用于整數類型的主鍵列(如INT、BIGINT等),存儲空間相對較小。
    • UUID:雖然也是字符串類型,但由于其長度較長(32個字符),存儲空間相對較大。
  3. 插入性能
    • 自增主鍵:在插入新行時,數據庫可以很容易地將新行插入到索引的末尾,減少了頁分裂或移動數據的頻率,從而提高了插入性能。
    • UUID:由于UUID是隨機生成的,插入時位置具有不確定性,可能導致無序插入和內存碎片,插入性能相對較差。
  4. 索引和查詢性能
    • 自增主鍵:由于其遞增的特性,非常適合用作聚集索引(Clustered Index),能夠優化查詢性能。同時,較小的索引大小也可以減少內存消耗,更好地適應于內存緩存。
    • UUID:由于UUID的無序性,可能導致索引碎片化,影響查詢性能。同時,較大的索引大小也可能增加內存消耗。
  5. 可預測性
    • 自增主鍵:主鍵值是可預測的,因為它們是按順序生成的。
    • UUID:主鍵值是不可預測的,因為它們是隨機生成的。這種不可預測性對于需要保密性的應用場景較為適用。
  6. 刪除和重新插入
    • 自增主鍵:在刪除并重新插入數據后,可能會出現主鍵值“跳躍”的現象,即新插入的主鍵值可能會比之前刪除的主鍵值大很多。
    • UUID:UUID在刪除和重新插入數據時,主鍵值不會受到影響,因為它們是隨機生成的。

?????????自增主鍵和UUID在MySQL中各有優缺點,選擇哪種方式作為主鍵取決于具體的應用場景和需求。例如,在需要高性能插入和查詢的場景下,自增主鍵可能更合適;而在需要保證主鍵全局唯一性和不可預測性的場景下,UUID可能更合適。

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

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

相關文章

打卡信奧刷題(21)用Scratch圖形化工具信奧P7071 [CSP-J2020] 優秀的拆分

使用2進制進行拆分是比較好的解決方案,畢竟對于大家來說二進制轉換是非常熟的,如果不會可以參考打卡信奧刷題(19)用Scratch圖形化工具信奧B3972 [語言月賽 202405] 二進制 題解 ,輸出的時候再轉換一下輸出,…

M功能-支付平臺(三)

target:離開柬埔寨倒計時-221day 前言 今天周六,但是在柬埔寨還是工作日,想著國內的朋友開始休周末就羨慕呀,記不清在這邊過了多少個周六了,多到我已經習慣了。而且今天技術部還停電了,真的是熱的受不了呀…

c++11:智能指針的種類以及使用場景

指針管理困境 內存釋放,指針沒有置空;內存泄漏;資源重復釋放 怎樣解決? RAII 智能指針種類 shared_ptr 實現原理:多個指針指向同一資源,引用計數清零,再調用析構函數釋放內存。 使用場景…

ASP.NET 代碼審計

ASP.NET 官方文檔 名詞解釋 IIS(Internet Information Services) IIS 是微軟開發的一款 Web 服務器軟件,用于在 Windows 服務器上托管和提供Web應用程序和服務。它支持 HTTP、HTTPS、FTP、SMTP 等多種協議,主要用于&#xff1a…

基于混合Transformer-CNN模型的多分辨率學習方法的解剖學標志檢測

文章目錄 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model摘要方法實驗結果 Anatomical Landmark Detection Using a Multiresolution Learning Approach with a Hybrid Transformer-CNN Model 摘要 精確定位…

跨域計算芯片,一把被忽視的汽車降本尖刀

作者 |王博 編輯 |德新 2019年前后,「中央運算單元區域控制」的架構被提出。基于這一趨勢,從板級的多芯片,到板級的單芯片,集成度越來越高,跨域計算芯片隨之來到聚光燈下。 跨域計算芯片的特點是,與專為智…

Django 里傳參給html文件

第一步:在 urls.py 文件里修改 from django.contrib import admin from django.urls import path from app01 import views # 添加這一行urlpatterns [#path(admin/, admin.site.urls),path(index/, views.index), # 添加這一行 ]第二步:在 settings…

若依框架的配置文件詳解:從數據庫配置到高級定制

若依框架(RuoYi)作為一個基于Spring Boot和MyBatis的快速開發平臺,提供了豐富的配置選項,讓開發者能夠靈活地調整和擴展其功能。配置文件在若依框架中扮演著至關重要的角色,通過合理配置,可以實現對數據庫連…

牛客網刷題 | BC97 回文對稱數

目前主要分為三個專欄,后續還會添加: 專欄如下: C語言刷題解析 C語言系列文章 我的成長經歷 感謝閱讀! 初來乍到,如有錯誤請指出,感謝! 描述 今天牛牛學到了回文…

鎖相環的一些學習筆記--(1)

下圖兩組1.2.3可以對應起來; 一些分析: 1.根據這個可知最后vco_voltage停在0.5v 參考資料: 1. Matlab https://www.bilibili.com/video/BV1bR4y1Z7Xg/?spm_id_from333.1296.top_right_bar_window_history.content.click&vd_source555…

Redis RDB 持久化問題

前言 Redis 是內存數據庫,它將自己的數據儲存在內存里面,如果不想辦法將儲存在內存中的數據保存到磁盤里面,那么一旦服務器進程退出,服務器中的數據也就沒了。 因此,Redis 提供了 RDB 持久化功能,這個功能…

如何將Windows PC變成Wi-Fi熱點?這里提供詳細步驟

序言 Windows 10和Windows 11都有內置功能,可以將你的筆記本電腦(或臺式機)變成無線熱點,允許其他設備連接到它并共享你的互聯網連接。以下是操作指南。 由于Windows中隱藏的虛擬Wi-Fi適配器功能,你甚至可以在連接到另一個Wi-Fi網絡或無線路由器時創建Wi-Fi熱點,通過另…

魯教版七年級數學上冊-筆記

文章目錄 第一章 三角形1 認識三角形2 圖形的全等3 探索三角形全等的條件4 三角形的尺規作圖5 利用三角形全等測距離 第二章 軸對稱1 軸對稱現象2 探索軸對稱的性質4 利用軸對稱進行設計 第三章 勾股定理1 探索勾股定理2 一定是直角三角形嗎3 勾股定理的應用舉例 第四章 實數1 …

實習生在Linux環境下如何日常使用?

那我簡單來說兩個我使用的場景吧 我在搭建我們的測試環境的時候,先上傳jar包到測試環境對應的目錄下,然后呢此時jar包是不可被執行的,所有就有了 chmod x jar包名稱, 接下來,我是用 jps 查看Java的進程,獲取到pid之后…

Kafka 安裝教程和基本操作

一、簡介 Kafka 是最初由 Linkedin 公司開發,是一個分布式、分區的、多副本的、多訂閱者,基于 zookeeper 協調的分布式日志系統(也可以當做 MQ 系統),常見可以用于 web/nginx 日志、訪問日志,消息服務等等…

基于YOLO算法實現網球運動實時分析(附源碼)

大家好,我是小F~ 今天給大家介紹一個計算機視覺實戰的項目。 該項目使用YOLO算法檢測球員和網球,并利用cnn提取球場關鍵點。 進而分析視頻中的網球運動員,測量他們的速度、擊球速度和擊球次數。 使用win10電腦,Python …

【源碼】java + uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼

java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 帶簡潔教程,未測 java uniapp交易所源代碼/帶搭建教程java交易所/完整源代碼 - 吾愛資源網

【古董技術】ms-dos應用程序的結構

序 制定一個MS-DOS應用程序計劃需要認真分析程序的大小。這種分析可以幫助程序員確定MS-DOS支持的兩種程序風格中哪一種最適合該應用程序。.EXE程序結構為大型程序提供了好處,因為所有.EXE文件之前都有額外的512字節(或更多)的文件頭。另一方…

C++第十七彈---string使用(下)

?個人主頁: 熬夜學編程的小林 💗系列專欄: 【C語言詳解】 【數據結構詳解】【C詳解】 目錄 1、標準庫中的string類 1.1、string類的常用接口說明 1.1.1、string類對象的修改操作 1.1.2、string類對象非成員函數重載 總結 1、標準庫中的…

牛客熱題:有效括號

📟作者主頁:慢熱的陜西人 🌴專欄鏈接:力扣刷題日記 📣歡迎各位大佬👍點贊🔥關注🚓收藏,🍉留言 文章目錄 牛客熱題:有效括號題目鏈接方法一&#x…