亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL主鍵生成的四種方式及對比詳解

 更新時間:2025年03月18日 09:44:05   作者:四七伵  
在數(shù)據(jù)庫設(shè)計中,主鍵(Primary Key)的選擇至關(guān)重要,它不僅是數(shù)據(jù)行的唯一標識,還直接影響查詢效率、數(shù)據(jù)存儲甚至系統(tǒng)架構(gòu)的擴展性,本文給大家分析了常見四種主鍵ID生成的方式,需要的朋友可以參考下

前言

在數(shù)據(jù)庫設(shè)計中,主鍵(Primary Key)的選擇至關(guān)重要。它不僅是數(shù)據(jù)行的唯一標識,還直接影響查詢效率、數(shù)據(jù)存儲甚至系統(tǒng)架構(gòu)的擴展性。MySQL中常見的主鍵生成方式包括自增ID、UUID、雪花算法(Snowflake)等,每種方式都有其獨特的適用場景和優(yōu)缺點。接下來將分析常見四種主鍵ID生成的方式。

一、自增ID

什么是自增ID?

自增ID是MySQL內(nèi)置的主鍵生成方式。通過AUTO_INCREMENT關(guān)鍵字,每插入一條新數(shù)據(jù),主鍵值自動加1。

案例:訂單表

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    amount DECIMAL(10,2)
);

插入數(shù)據(jù)時,無需指定id字段:

INSERT INTO orders (user_id, amount) VALUES (1001, 99.99);

優(yōu)點

  • 簡單高效:數(shù)據(jù)庫自動生成,開發(fā)成本低。
  • 查詢性能好:主鍵按順序遞增,減少索引碎片,B+樹結(jié)構(gòu)更緊湊。
  • 存儲空間小:通常使用INT(4字節(jié))或BIGINT(8字節(jié))。

缺點

  • 分庫分表困難:自增ID在分布式系統(tǒng)中可能重復(fù)。
  • 暴露業(yè)務(wù)信息:連續(xù)遞增的ID可能被推測業(yè)務(wù)量(如訂單數(shù))。
  • 數(shù)據(jù)遷移麻煩:合并不同數(shù)據(jù)庫的表時容易沖突。

二、UUID

什么是UUID?

UUID是一個128位的字符串(如550e8400-e29b-41d4-a716-446655440000),理論上全球唯一。

案例:用戶表

CREATE TABLE users (
    uuid CHAR(36) PRIMARY KEY,
    name VARCHAR(50)
);

插入數(shù)據(jù)時生成UUID:

INSERT INTO users (uuid, name) VALUES (UUID(), '張三');

優(yōu)點

  • 全局唯一:分布式系統(tǒng)中無需擔心ID沖突。
  • 安全性高:無序的ID避免暴露業(yè)務(wù)量。

缺點

  • 存儲空間大:36字符的字符串占用更多空間(若優(yōu)化為二進制仍需16字節(jié))。
  • 查詢性能差:無序的ID導(dǎo)致索引頻繁分 裂,插入速度變慢。
  • 可讀性差:長字符串難以記憶,調(diào)試時不夠直觀。

三、雪花算法(Snowflake)

什么是雪花算法?

雪花算法是Twitter開源的分布式ID生成算法,生成一個64位的長整型數(shù)字,結(jié)構(gòu)如下:
符號位(1位) + 時間戳(41位) + 機器ID(10位) + 序列號(12位)。

案例:分布式日志表

// Java代碼示例(使用Hutool工具庫)
Snowflake snowflake = IdUtil.getSnowflake(1, 1);
long id = snowflake.nextId(); // 生成類似6726434627886811136的ID

建表時使用BIGINT類型:

CREATE TABLE logs (
    id BIGINT PRIMARY KEY,
    content TEXT
);

優(yōu)點

  • 分布式友好:不同機器生成的ID不會重復(fù)。
  • 性能與存儲平衡:BIGINT類型僅需8字節(jié),且保持遞增趨勢。
  • 時間有序:可根據(jù)ID直接推算出創(chuàng)建時間。

缺點

  • 依賴服務(wù)器時鐘:時鐘回撥可能導(dǎo)致ID重復(fù)(需特殊處理)。
  • 機器ID需分配:需提前規(guī)劃機器ID,避免超過1024臺實例。

四、業(yè)務(wù)字段組合

什么是業(yè)務(wù)字段組合?

直接使用業(yè)務(wù)相關(guān)的字段作為主鍵(如“用戶ID+商品ID”)。

案例:學生選課表

CREATE TABLE course_selection (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id)
);

優(yōu)點

  • 直觀明確:主鍵直接反映業(yè)務(wù)含義。
  • 避免冗余字段:無需額外的主鍵列。

缺點

  • 維護成本高:業(yè)務(wù)規(guī)則變化時可能需修改主鍵。
  • 存儲空間大:聯(lián)合主鍵可能占用更多空間。
  • 查詢復(fù)雜度高:多條件查詢可能影響性能。

五、如何選擇主鍵生成方式?

場景推薦方式理由
單機MySQL自增ID簡單高效,適合小型系統(tǒng)
分布式系統(tǒng)雪花算法平衡性能與全局唯一性,適合分庫分表
高安全性需求UUID避免ID被推測,適合匿名數(shù)據(jù)
強業(yè)務(wù)關(guān)聯(lián)業(yè)務(wù)字段組合如訂單號包含日期、用戶ID等業(yè)務(wù)信息

結(jié)語

選擇主鍵生成方式時,需綜合考慮系統(tǒng)規(guī)模、擴展性、性能業(yè)務(wù)需求。

  • 自增ID適合傳統(tǒng)單機應(yīng)用,但難以應(yīng)對分布式場景。
  • UUID解決了全局唯一性問題,卻犧牲了性能和存儲。
  • 雪花算法在分布式系統(tǒng)中表現(xiàn)優(yōu)異,但需解決時鐘回撥問題。
  • 業(yè)務(wù)字段組合在特定場景下簡潔有效,但靈活性較低。

實際開發(fā)中,可以結(jié)合多種方式。例如,在電商系統(tǒng)中,訂單ID使用雪花算法保證分布式唯一性,而訂單明細表則用自增ID提升插入效率。根據(jù)業(yè)務(wù)特點靈活選擇,才能找到最優(yōu)解

以上就是MySQL主鍵生成的四種方式及對比詳解的詳細內(nèi)容,更多關(guān)于MySQL主鍵生成方式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • PHP定時備份MySQL與mysqldump語法參數(shù)詳解

    PHP定時備份MySQL與mysqldump語法參數(shù)詳解

    本文為大家介紹了PHP利用mysqldump命令定時備份MySQL與mysqldump語法參數(shù)大全以及定時備份的PHP實例代碼
    2018-10-10
  • Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn)

    Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn)

    很多情況需要升級MySQL的數(shù)據(jù)庫版本,本文主要介紹了Mysql數(shù)據(jù)庫5.7升級到8.4的實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • MySQL報錯sql_mode=only_full_group_by的問題解決

    MySQL報錯sql_mode=only_full_group_by的問題解決

    本文主要介紹了MySQL報錯sql_mode=only_full_group_by的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • MySQL 請選擇合適的列

    MySQL 請選擇合適的列

    如果你的表結(jié)構(gòu)設(shè)計不良或你的索引設(shè)計不佳,那么請你優(yōu)化你的表結(jié)構(gòu)設(shè)計和給予合適的索引,這樣你的查詢性能就能提高幾個數(shù)量級?!獢?shù)據(jù)越大,索引的價值越能體現(xiàn)出來
    2012-05-05
  • MySQL中使用MD5加密的實現(xiàn)

    MySQL中使用MD5加密的實現(xiàn)

    本文主要介紹了MySQL中使用MD5加密的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • MySQL慢查詢以及解決方案詳解

    MySQL慢查詢以及解決方案詳解

    MySQL的慢查詢,全名是慢查詢?nèi)罩?是MySQL提供的一種日志記錄,用來記錄在MySQL中響應(yīng)時間超過閥值的語句,下面這篇文章主要給大家介紹了關(guān)于MySQL慢查詢以及解決方案的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Windows MySQL修改配置文件my.ini不生效問題

    Windows MySQL修改配置文件my.ini不生效問題

    在Windows Server 2019上修改MySQL 5.6的安裝目錄下my.ini文件后,需要通過修改注冊表中的ImagePath值來確保MySQL讀取新的配置文件,修改時應(yīng)確保配置文件路徑正確,并且新配置不會覆蓋原有配置,以保證修改生效
    2025-01-01
  • mysql 5.7.16 免安裝版安裝配置方法圖文教程

    mysql 5.7.16 免安裝版安裝配置方法圖文教程

    這篇文章主要為大家詳細介紹了mysql 5.7.16 免安裝版安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Mysql查看死鎖與解除死鎖的深入講解

    Mysql查看死鎖與解除死鎖的深入講解

    這篇文章主要給大家介紹了關(guān)于Mysql查看死鎖與解除死鎖的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • MySQL建表設(shè)置默認值的取值范圍

    MySQL建表設(shè)置默認值的取值范圍

    這篇文章主要介紹了MySQL建表設(shè)置默認值的取值范圍,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評論