欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

一、自增ID

什么是自增ID?

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

案例:訂單表

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

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

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

優(yōu)點(diǎn)

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

缺點(diǎn)

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

二、UUID

什么是UUID?

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

案例:用戶表

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

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

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

優(yōu)點(diǎn)

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

缺點(diǎn)

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

三、雪花算法(Snowflake)

什么是雪花算法?

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

案例:分布式日志表

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

建表時(shí)使用BIGINT類型:

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

優(yōu)點(diǎn)

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

缺點(diǎn)

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

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

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

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

案例:學(xué)生選課表

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

優(yōu)點(diǎn)

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

缺點(diǎn)

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

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

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

結(jié)語

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

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

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

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

相關(guān)文章

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

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

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

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

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

    MySQL報(bào)錯(cuò)sql_mode=only_full_group_by的問題解決

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

    MySQL 請選擇合適的列

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

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

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

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

    MySQL的慢查詢,全名是慢查詢?nèi)罩?是MySQL提供的一種日志記錄,用來記錄在MySQL中響應(yīng)時(shí)間超過閥值的語句,下面這篇文章主要給大家介紹了關(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讀取新的配置文件,修改時(shí)應(yīng)確保配置文件路徑正確,并且新配置不會覆蓋原有配置,以保證修改生效
    2025-01-01
  • mysql 5.7.16 免安裝版安裝配置方法圖文教程

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

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

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

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

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

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

最新評論