最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL主鍵生成的四種方式及對(duì)比詳解

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

前言

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

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

缺點(diǎn)

  • 分庫分表困難:自增ID在分布式系統(tǒng)中可能重復(fù)。
  • 暴露業(yè)務(wù)信息:連續(xù)遞增的ID可能被推測(cè)業(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)

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

三、雪花算法(Snowflake)

什么是雪花算法?

雪花算法是Twitter開源的分布式ID生成算法,生成一個(gè)64位的長(zhǎng)整型數(shù)字,結(jié)構(gòu)如下:
符號(hào)位(1位) + 時(shí)間戳(41位) + 機(jī)器ID(10位) + 序列號(hào)(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不會(huì)重復(fù)。
  • 性能與存儲(chǔ)平衡:BIGINT類型僅需8字節(jié),且保持遞增趨勢(shì)。
  • 時(shí)間有序:可根據(jù)ID直接推算出創(chuàng)建時(shí)間。

缺點(diǎn)

  • 依賴服務(wù)器時(shí)鐘:時(shí)鐘回?fù)芸赡軐?dǎo)致ID重復(fù)(需特殊處理)。
  • 機(jī)器ID需分配:需提前規(guī)劃?rùn)C(jī)器ID,避免超過1024臺(tái)實(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í)可能需修改主鍵。
  • 存儲(chǔ)空間大:聯(lián)合主鍵可能占用更多空間。
  • 查詢復(fù)雜度高:多條件查詢可能影響性能。

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

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

結(jié)語

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

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

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

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

相關(guān)文章

  • Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程

    Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Linux虛擬機(jī)下mysql 5.7安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • MySQL查看數(shù)據(jù)庫、表和索引的容量大小的方法

    MySQL查看數(shù)據(jù)庫、表和索引的容量大小的方法

    在我們平時(shí)工作中,如果一個(gè)業(yè)務(wù)運(yùn)行很久了,可能會(huì)需要我們?nèi)タ纯催@塊業(yè)務(wù)產(chǎn)生的數(shù)據(jù)量有多大,比如這個(gè)業(yè)務(wù)所使用的數(shù)據(jù)庫存儲(chǔ)空間都使用了多少個(gè)G了,哪一張數(shù)據(jù)表才是大表,下面整理了一些可以拿來即用的SQL以供小伙伴們參考,需要的朋友可以參考下
    2025-09-09
  • MySQL 鎖的完整分類與詳解

    MySQL 鎖的完整分類與詳解

    MySQL中的鎖可以從鎖粒度、鎖類型、鎖狀態(tài)三個(gè)維度劃分,下面按 “粒度 + 類型” 的邏輯體系,逐一說明所有核心鎖的定義、作用和使用場(chǎng)景,對(duì)mysql鎖分類相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • mysql字段截取的幾種函數(shù)和搭配函數(shù)示例代碼

    mysql字段截取的幾種函數(shù)和搭配函數(shù)示例代碼

    在 MySQL 數(shù)據(jù)庫中,有時(shí)我們需要截取字段或字符串的一部分進(jìn)行查詢、展示或處理,下面這篇文章主要介紹了mysql字段截取的幾種函數(shù)和搭配函數(shù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-09-09
  • mysql修改記錄時(shí)update操作 字段=字段+字符串

    mysql修改記錄時(shí)update操作 字段=字段+字符串

    這篇文章主要介紹了mysql修改記錄時(shí)update操作 字段=字段+字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • 使用Rotate Master實(shí)現(xiàn)MySQL 多主復(fù)制的實(shí)現(xiàn)方法

    使用Rotate Master實(shí)現(xiàn)MySQL 多主復(fù)制的實(shí)現(xiàn)方法

    眾所周知,MySQL只支持一對(duì)多的主從復(fù)制,而不支持多主(multi-master)復(fù)制
    2012-05-05
  • MySQL壓力測(cè)試方法 如何使用mysqlslap測(cè)試MySQL的壓力?

    MySQL壓力測(cè)試方法 如何使用mysqlslap測(cè)試MySQL的壓力?

    生產(chǎn)服務(wù)器用LANMP組合和用LAMP組合有段時(shí)間了,總體來說都很穩(wěn)定。但出現(xiàn)過幾次因?yàn)镸YSQL并發(fā)太多而掛掉,一直想對(duì)MYSQL做壓力測(cè)試。剛看到一篇介紹MYSQL壓力測(cè)試的文章,確實(shí)不錯(cuò),先收藏先吧
    2016-05-05
  • 21分鐘 MySQL 入門教程

    21分鐘 MySQL 入門教程

    這篇文章主要介紹了MySQL 入門教程,通過簡(jiǎn)單的介紹基本上可以讓你21分鐘就可以了解下mysql
    2014-06-06
  • MySQL數(shù)據(jù)庫的多種連接方式以及實(shí)用工具

    MySQL數(shù)據(jù)庫的多種連接方式以及實(shí)用工具

    mysql連接操作是客戶端進(jìn)程與mysql數(shù)據(jù)庫實(shí)例進(jìn)程進(jìn)行通信,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫的多種連接方式以及實(shí)用工具的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • 遠(yuǎn)程登錄MySQL服務(wù)(小白入門篇)

    遠(yuǎn)程登錄MySQL服務(wù)(小白入門篇)

    這篇文章主要為大家介紹了遠(yuǎn)程登錄MySQL服務(wù)(小白入門篇)
    2023-05-05

最新評(píng)論

平顺县| 古田县| 安多县| 深泽县| 奉新县| 祁东县| 焦作市| 巴林左旗| 嘉定区| 丰顺县| 时尚| 精河县| 宁强县| 绥阳县| 彩票| 富裕县| 扎囊县| 龙南县| 明水县| 青川县| 满洲里市| 繁昌县| 马山县| 岫岩| 余江县| 松阳县| 岱山县| 通渭县| 聊城市| 南投县| 阿拉善左旗| 九寨沟县| 海城市| 双江| 定兴县| 红河县| 正阳县| 射阳县| 灌云县| 和林格尔县| 米易县|