设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间13 现在时间13 缓存数据 05|快乐缺点勇气 浪漫缺点诗意\你低头不说一句\你朝着灰色走去\你住进混沌深海\你开始无望等待|词曲/编混:陈粒

05|快乐缺点勇气 浪漫缺点诗意\你低头不说一句\你朝着灰色走去\你住进混沌深海\你开始无望等待|词曲/编混:陈粒 -- 光

查看: 291|回复: 0

MySQL主键生成的四种方式及对比详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:16
  • 打卡月天数:0
  • 打卡总奖励:236
  • 最近打卡:2025-03-31 17:19:05
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
342
主题
290
精华
0
金钱
1193
积分
666
注册时间
2023-2-11
最后登录
2025-5-31

发表于 2025-5-31 06:38:04 | 显示全部楼层 |阅读模式
前言

在数据库设计中,主键(Primary Key)的选择至关重要。它不仅是数据行的唯一标识,还直接影响查询效率、数据存储甚至系统架构的扩展性。MySQL中常见的主键生成方式包括自增ID、UUID、雪花算法(Snowflake)等,每种方式都有其独特的适用场景和优缺点。接下来将分析常见四种主键ID生成的方式。

一、自增ID


什么是自增ID?

自增ID是MySQL内置的主键生成方式。通过
  1. AUTO_INCREMENT
复制代码
关键字,每插入一条新数据,主键值自动加1。

案例:订单表
  1. CREATE TABLE orders (
  2.     id INT AUTO_INCREMENT PRIMARY KEY,
  3.     user_id INT,
  4.     amount DECIMAL(10,2)
  5. );
复制代码
插入数据时,无需指定
  1. id
复制代码
字段:
  1. INSERT INTO orders (user_id, amount) VALUES (1001, 99.99);
复制代码



优点


  • 简单高效:数据库自动生成,开发成本低。
  • 查询性能好:主键按顺序递增,减少索引碎片,B+树结构更紧凑。
  • 存储空间小:通常使用
    1. INT
    复制代码
    (4字节)或
    1. BIGINT
    复制代码
    (8字节)。




缺点


  • 分库分表困难:自增ID在分布式系统中可能重复。
  • 暴露业务信息:连续递增的ID可能被推测业务量(如订单数)。
  • 数据迁移麻烦:合并不同数据库的表时容易冲突。

二、UUID


什么是UUID?

UUID是一个128位的字符串(如
  1. 550e8400-e29b-41d4-a716-446655440000
复制代码
),理论上全球唯一。

案例:用户表
  1. CREATE TABLE users (
  2.     uuid CHAR(36) PRIMARY KEY,
  3.     name VARCHAR(50)
  4. );
复制代码
插入数据时生成UUID:
  1. INSERT INTO users (uuid, name) VALUES (UUID(), '张三');
复制代码
优点


  • 全局唯一:分布式系统中无需担心ID冲突。
  • 安全性高:无序的ID避免暴露业务量。
缺点


  • 存储空间大:36字符的字符串占用更多空间(若优化为二进制仍需16字节)。
  • 查询性能差:无序的ID导致索引频繁分 裂,插入速度变慢。
  • 可读性差:长字符串难以记忆,调试时不够直观。

三、雪花算法(Snowflake)


什么是雪花算法?

雪花算法是Twitter开源的分布式ID生成算法,生成一个64位的长整型数字,结构如下:
  1. 符号位(1位) + 时间戳(41位) + 机器ID(10位) + 序列号(12位)
复制代码


案例:分布式日志表
  1. // Java代码示例(使用Hutool工具库)
  2. Snowflake snowflake = IdUtil.getSnowflake(1, 1);
  3. long id = snowflake.nextId(); // 生成类似6726434627886811136的ID
复制代码
建表时使用
  1. BIGINT
复制代码
类型:
  1. CREATE TABLE logs (
  2.     id BIGINT PRIMARY KEY,
  3.     content TEXT
  4. );
复制代码
优点


  • 分布式友好:不同机器生成的ID不会重复。
  • 性能与存储平衡:BIGINT类型仅需8字节,且保持递增趋势。
  • 时间有序:可根据ID直接推算出创建时间。
缺点


  • 依赖服务器时钟:时钟回拨可能导致ID重复(需特殊处理)。
  • 机器ID需分配:需提前规划机器ID,避免超过1024台实例。

四、业务字段组合


什么是业务字段组合?

直接使用业务相关的字段作为主键(如“用户ID+商品ID”)。

案例:学生选课表
  1. CREATE TABLE course_selection (
  2.     student_id INT,
  3.     course_id INT,
  4.     PRIMARY KEY (student_id, course_id)
  5. );
复制代码
优点


  • 直观明确:主键直接反映业务含义。
  • 避免冗余字段:无需额外的主键列。
缺点


  • 维护成本高:业务规则变化时可能需修改主键。
  • 存储空间大:联合主键可能占用更多空间。
  • 查询复杂度高:多条件查询可能影响性能。

五、如何选择主键生成方式?

场景推荐方式理由单机MySQL自增ID简单高效,适合小型系统分布式系统雪花算法平衡性能与全局唯一性,适合分库分表高安全性需求UUID避免ID被推测,适合匿名数据强业务关联业务字段组合如订单号包含日期、用户ID等业务信息
结语

选择主键生成方式时,需综合考虑系统规模扩展性性能业务需求

  • 自增ID适合传统单机应用,但难以应对分布式场景。
  • UUID解决了全局唯一性问题,却牺牲了性能和存储。
  • 雪花算法在分布式系统中表现优异,但需解决时钟回拨问题。
  • 业务字段组合在特定场景下简洁有效,但灵活性较低。
实际开发中,可以结合多种方式。例如,在电商系统中,订单ID使用雪花算法保证分布式唯一性,而订单明细表则用自增ID提升插入效率。根据业务特点灵活选择,才能找到最优解
以上就是MySQL主键生成的四种方式及对比详解的详细内容,更多关于MySQL主键生成方式的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表