当前位置: 代码网 > it编程>数据库>Mysql > MySQL主键生成的四种方式及对比详解

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

2025年03月18日 Mysql 我要评论
前言在数据库设计中,主键(primary key)的选择至关重要。它不仅是数据行的唯一标识,还直接影响查询效率、数据存储甚至系统架构的扩展性。mysql中常见的主键生成方式包括自增id、uuid、雪花

前言

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

一、自增id

什么是自增id?

自增id是mysql内置的主键生成方式。通过auto_increment关键字,每插入一条新数据,主键值自动加1。

案例:订单表

create table orders (
    id int auto_increment primary key,
    user_id int,
    amount decimal(10,2)
);

插入数据时,无需指定id字段:

insert into orders (user_id, amount) values (1001, 99.99);

优点

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

缺点

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

二、uuid

什么是uuid?

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

案例:用户表

create table users (
    uuid char(36) primary key,
    name varchar(50)
);

插入数据时生成uuid:

insert into users (uuid, name) values (uuid(), '张三');

优点

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

缺点

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

三、雪花算法(snowflake)

什么是雪花算法?

雪花算法是twitter开源的分布式id生成算法,生成一个64位的长整型数字,结构如下:
符号位(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
);

优点

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

缺点

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

四、业务字段组合

什么是业务字段组合?

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

案例:学生选课表

create table course_selection (
    student_id int,
    course_id int,
    primary key (student_id, course_id)
);

优点

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

缺点

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

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

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

结语

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

  • 自增id适合传统单机应用,但难以应对分布式场景。
  • uuid解决了全局唯一性问题,却牺牲了性能和存储。
  • 雪花算法在分布式系统中表现优异,但需解决时钟回拨问题。
  • 业务字段组合在特定场景下简洁有效,但灵活性较低。

实际开发中,可以结合多种方式。例如,在电商系统中,订单id使用雪花算法保证分布式唯一性,而订单明细表则用自增id提升插入效率。根据业务特点灵活选择,才能找到最优解

以上就是mysql主键生成的四种方式及对比详解的详细内容,更多关于mysql主键生成方式的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com