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

 更新时间:2025年03月18日 09:44:05   作者:四七伵  
在数据库设计中,主键(Primary Key)的选择至关重要,它不仅是数据行的唯一标识,还直接影响查询效率、数据存储甚至系统架构的扩展性,本文给大家分析了常见四种主键ID生成的方式,需要的朋友可以参考下

前言

在数据库设计中,主键(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主键生成方式的资料请关注脚本之家其它相关文章!

相关文章

  • Linux虚拟机下mysql 5.7安装配置方法图文教程

    Linux虚拟机下mysql 5.7安装配置方法图文教程

    这篇文章主要为大家详细介绍了Linux虚拟机下mysql 5.7安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MySQL查看数据库、表和索引的容量大小的方法

    MySQL查看数据库、表和索引的容量大小的方法

    在我们平时工作中,如果一个业务运行很久了,可能会需要我们去看看这块业务产生的数据量有多大,比如这个业务所使用的数据库存储空间都使用了多少个G了,哪一张数据表才是大表,下面整理了一些可以拿来即用的SQL以供小伙伴们参考,需要的朋友可以参考下
    2025-09-09
  • MySQL 锁的完整分类与详解

    MySQL 锁的完整分类与详解

    MySQL中的锁可以从锁粒度、锁类型、锁状态三个维度划分,下面按 “粒度 + 类型” 的逻辑体系,逐一说明所有核心锁的定义、作用和使用场景,对mysql锁分类相关知识感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • mysql字段截取的几种函数和搭配函数示例代码

    mysql字段截取的几种函数和搭配函数示例代码

    在 MySQL 数据库中,有时我们需要截取字段或字符串的一部分进行查询、展示或处理,下面这篇文章主要介绍了mysql字段截取的几种函数和搭配函数的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-09-09
  • mysql修改记录时update操作 字段=字段+字符串

    mysql修改记录时update操作 字段=字段+字符串

    这篇文章主要介绍了mysql修改记录时update操作 字段=字段+字符串,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • 使用Rotate Master实现MySQL 多主复制的实现方法

    使用Rotate Master实现MySQL 多主复制的实现方法

    众所周知,MySQL只支持一对多的主从复制,而不支持多主(multi-master)复制
    2012-05-05
  • MySQL压力测试方法 如何使用mysqlslap测试MySQL的压力?

    MySQL压力测试方法 如何使用mysqlslap测试MySQL的压力?

    生产服务器用LANMP组合和用LAMP组合有段时间了,总体来说都很稳定。但出现过几次因为MYSQL并发太多而挂掉,一直想对MYSQL做压力测试。刚看到一篇介绍MYSQL压力测试的文章,确实不错,先收藏先吧
    2016-05-05
  • 21分钟 MySQL 入门教程

    21分钟 MySQL 入门教程

    这篇文章主要介绍了MySQL 入门教程,通过简单的介绍基本上可以让你21分钟就可以了解下mysql
    2014-06-06
  • MySQL数据库的多种连接方式以及实用工具

    MySQL数据库的多种连接方式以及实用工具

    mysql连接操作是客户端进程与mysql数据库实例进程进行通信,下面这篇文章主要给大家介绍了关于MySQL数据库的多种连接方式以及实用工具的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-02-02
  • 远程登录MySQL服务(小白入门篇)

    远程登录MySQL服务(小白入门篇)

    这篇文章主要为大家介绍了远程登录MySQL服务(小白入门篇)
    2023-05-05

最新评论