Mysql ID生成策略的三种方法选择及优缺点

 更新时间:2024年06月23日 16:53:39   作者:简单简单小白  
mysql ID生成策略一般常用的有三种,包括自增、UUID 以及雪花算法,本文主要介绍了Mysql ID生成策略的三种方法选择及优缺点,具有一定的参考价值,感兴趣的可以了解一下

mysql ID生成策略一般常用的有三种:自增、UUID 以及雪花算法,下面就拿着三种展开分析一下。

自增主键(Auto Increment)

优点:

简单、易于使用和理解,保证唯一性,无需额外的查询操作。

缺点:

不适用于分布式系统,因为每个节点都需要维护一个独立的计数器,可能会导致冲突和性能问题。

使用场景:

适用于单机或小规模应用,不需要分布式支持的场景。例如,传统的单机应用、小型网站或内部管理系统。

UUID(Universally Unique Identifier)

优点:

全局唯一性,分布式支持,独立性。

缺点:

占用较多的存储空间,无序性,可读性较低。

使用场景:

适用于需要分布式支持、全局唯一性和独立生成ID的场景,特别是在没有数据库连接的情况下。例如,分布式系统、大规模系统或需要独立生成ID的场景。

雪花算法(Snowflake)

优点:

支持分布式环境,生成的ID有序且唯一,包含时间戳信息。

缺点:

依赖于机器的唯一标识,不同机器之间的时间同步问题可能导致ID重复。

使用场景:

适用于需要分布式支持、有序和唯一的ID的场景。例如,大规模的分布式系统、微服务架构、分布式数据库等。

雪花算法生成 ID 冲突问题:

1. 前提条件:
服务通过集群的方式部署,其中部分机器标识位一致。
业务存在一定的并发量,没有并发量无法触发重复问题。
生成 ID 的时机:同一毫秒下的序列号一致。
2. 标识位如何定义才能不重复?
有两种方案:预分配和动态分配。

(1). 预分配(静态)

应用上线前,统计当前服务的节点数,人工去申请标识位。

这种方案,没有代码开发量,在服务节点固定或者项目少可以使用,但是解决不了服务节点动态扩容性问题。

(2). 动态分配

将标识位存放在 Redis、Zookeeper、MySQL 等中间件,在服务启动的时候去请求标识位,请求后标识位并将其更新为下一个可用的。

通过存放标识位,延伸出一个问题:雪花算法的 ID 是 服务内唯一还是全局唯一。

以 Redis 举例,如果要做服务内唯一,存放标识位的 Redis 节点使用自己项目内的就可以;如果是全局唯一,所有使用雪花算法的应用,要用同一个 Redis 节点。

两者的区别仅是 不同的服务间是否公用 Redis。如果没有全局唯一的需求,最好使 ID 服务内唯一,因为这样可以避免单点问题。

服务的节点数超过 1024,则需要做额外的扩展;可以扩展 10 bit 标识位,或者选择开源分布式 ID 框架。

动态分配实现方案:Redis 存储一个 Hash 结构 Key,包含两个键值对:dataCenterId 和 workerId。

        雪花算法不是万能的,并不能适用于所有场景。如果 ID 要求全局唯一并且服务节点超出 1024 节点,可以选择修改算法本身的组成,即扩展标识位,或者选择开源方案:美团LEAF、百度UID。

总结

根据实际使用场景进行选择:

单机或小规模应用:对于规模较小、不需要分布式支持的应用,ID自增是简单而可行的选择。它易于使用和理解,并能保证唯一性。

大规模分布式系统:在需要分布式支持、有序和唯一ID的大规模系统中,雪花算法是更合适的选择。它能够生成分布式环境下的有序且唯一ID,适应大规模的分布式架构。

分布式环境下的全局唯一ID:如果全局唯一性是主要要求,并且不需要严格的有序性,UUID是一个可选的策略。它可以在分布式环境中生成全局唯一的ID,适用于分布式系统、大规模系统或需要独立生成ID的场景。

需要注意的是,对于雪花算法和UUID,在分布式环境中需要注意时间同步问题。确保机器时间的同步性,以避免ID重复。

综上所述,选择适当的ID生成策略需要综合考虑系统规模、分布式支持、唯一性和有序性要求以及时间同步问题。自增主键适用于规模较小、不需要分布式支持的简单应用,而雪花算法则适用于需要分布式支持、有序和唯一ID的大规模应用。UUID 我们一般不做考虑,因为针对于分布式系统来说雪花算法比UUID方式性能更好,UUID占用存储更大。

到此这篇关于Mysql ID生成策略的选择及优缺点的文章就介绍到这了,更多相关Mysql ID生成策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL数据库数据删除操作详解

    MySQL数据库数据删除操作详解

    本文我们将要学习的是作为删除数据使用的 “DELETE” 语句,“DELETE” 语句是用来删除数据的,它不能用来删除数据表本身。删除数据表使用的是 “DROP” 语句,而 “DELETE” 的作用只是用来删除记录而已
    2022-08-08
  • 为什么MySQL 删除表数据 磁盘空间还一直被占用

    为什么MySQL 删除表数据 磁盘空间还一直被占用

    这篇文章主要讨论为什么MySQL 删除表数据 磁盘空间还一直被占用,项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。接下来小编就和大家一起进入下面文章内容的学习
    2021-10-10
  • MySQL 5.7.20绿色版安装详细图文教程

    MySQL 5.7.20绿色版安装详细图文教程

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。这篇文章主要介绍了MySQL 5.7.20绿色版安装详细图文教程,需要的朋友可以参考下
    2017-11-11
  • Ubuntu下MySQL及工具安装配置详解

    Ubuntu下MySQL及工具安装配置详解

    这篇文章主要为大家详细介绍了Ubuntu下MySQL及工具安装配置方法,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Windows下MySQL主从复制的配置方法

    Windows下MySQL主从复制的配置方法

    MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
    2020-04-04
  • 浅谈MySQL为什么会选错索引

    浅谈MySQL为什么会选错索引

    本文主要介绍了浅谈MySQL为什么会选错索引,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySQL日志的详细分析实例

    MySQL日志的详细分析实例

    MySQL日志记录了MySQL数据库日常操作和错误信息,下面这篇文章主要给大家介绍了关于MySQL日志的详细分析,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • MySQL中GROUP_CONCAT函数用法和核心细节(按日期分组拼接销售产品经典案例)

    MySQL中GROUP_CONCAT函数用法和核心细节(按日期分组拼接销售产品经典案例)

    本文详细介绍了MySQL的GROUP_CONCAT()函数的用法和核心细节,包括函数定义、语法格式、常用修饰符(DISTINCT、ORDERBY、SEPARATOR)以及注意事项,感兴趣的朋友跟随小编一起看看吧
    2026-01-01
  • MySQL数据库完全卸载的方法

    MySQL数据库完全卸载的方法

    MySQL数据库是一款非常好用的数据库管理系统,但是相对来说卸载起来麻烦一些,本文就详细的介绍有一下卸载方法,感兴趣的可以了解一下
    2022-03-03
  • MySQL中定位DDL被阻塞的问题处理过程

    MySQL中定位DDL被阻塞的问题处理过程

    本文介绍了如何判断MySQL DDL是否被阻塞,以及如何定位和解决DDL阻塞问题,通过分析`sys.schema_table_lock_waits`表和`information_schema.innodb_trx`表,可以定位阻塞DDL的会话,并采取相应的解决措施
    2026-03-03

最新评论