为什么mysql不推荐使用uuid或者雪花id作为主键?

首先,UUID是一种“通用唯一识别码”,由32个16进制数字与4个“-”组成,长度为36个字符。版本4的UUID通过随机数生成,实现简单,本地生成,性能高,但生成的ID无序,存储成本高,可读性差。数据库自增ID方案选择一个数据库作为中央数据库,利用该库中某表的自增主键机制生成分布式ID。此方案单调递增...
为什么mysql不推荐使用uuid或者雪花id作为主键?
UUID和雪花算法在生成时并非递增序列,在未进行分库分表的情况下使用它们作为数据库主键可能导致MySQL的页分裂问题和磁盘的随机读问题。然而,雪花算法在分布式数据库中作为主键是主流实现方案。

我们需要了解分布式ID的原因是,当系统数据量过大并已完成分库分表后,需要对分散在各个库表中的数据记录进行唯一标识,而分布式ID恰能解决这一问题。

接下来,我们探讨八大分布式ID的生成方案及其优缺点。

首先,UUID是一种“通用唯一识别码”,由32个16进制数字与4个“-”组成,长度为36个字符。版本4的UUID通过随机数生成,实现简单,本地生成,性能高,但生成的ID无序,存储成本高,可读性差。

数据库自增ID方案选择一个数据库作为中央数据库,利用该库中某表的自增主键机制生成分布式ID。此方案单调递增,本地生成,可读性高,但涉及数据库操作,性能较低,需要额外引入中央数据库,增加链路复杂度和出错概率,且开发成本相对较高,数据库压力大。

通过Redis的INCR自增命令生成分布式ID,同样单调递增,ID生成性能高,本地生成,可读性高,但同样需要额外引入Redis,增加链路复杂度和出错概率,且Redis宕机后数据恢复较慢,开发成本相对较高。

雪花算法是Twitter公司开源的分布式ID生成算法,技术实现简单,生成的分布式ID趋势递增,本地生成,出错率低,性能高,但强依赖机器时钟,时钟回拨会导致ID重复,可读性差。

数据库号段方案在数据库自增ID的基础上优化,通过从中央数据库获取号段并缓存到本地,业务系统直接递增获取ID,趋势递增,本地生成,性能高,数据库压力小,但开发成本高,需要额外引入分布式ID服务和中央数据库,增加链路复杂度和出错概率。

美团Leaf分布式ID生成方案包括数据库号段模式(Leaf-segment)和雪花算法模式(Leaf-snowflake),其中Leaf-snowflake方案与雪花算法类似,但将SnowFlake服务独立化,并引入Zookeeper解决时钟回拨问题,趋势递增,解决时钟回拨问题,性能高,但第三方开源软件使用需熟悉成本,链路复杂,可读性差。

滴滴Tinyid分布式ID生成算法基于号段模式实现,支持数据库多主节点模式,并提供客户端接入方式,还做了号段预加载优化。趋势递增,性能高,数据库压力小,但第三方开源软件使用需熟悉成本,链路复杂。

百度UidGenerator是基于Snowflake算法的唯一ID生成器,提供自定义workerId位数和初始化策略,单机QPS可达600万,性能极高,但第三方开源软件使用需熟悉成本,强依赖机器时钟,可读性差。

目前最常用的分布式ID生成方案是雪花算法和数据库号段方式,但应根据系统特性进行选择。

分享一套深入浅出、细致易懂的高频面试题详解,旨在提升学习效率,需要者可获取。

强烈建议有求职诉求的Javaer仔细阅读。2024-11-14
mengvlog 阅读 35 次 更新于 2025-09-10 18:47:35 我来答关注问题0
  •  阿暄生活 【千锋云计算】Linux环境变量配置的6种方法,建议收藏!

    方法:使用vim ~/.bashrc,在文件最后一行添加export PATH=$PATH:/home/uusama/mysql/bin 注意事项:生效时间:使用相同用户打开新终端时生效,或手动source ~/.bashrc生效 生效期限:永久有效 生效范围:仅对当前用户有效 如有后续环境变量加载文件覆盖PATH定义,则可能不生效 修改~/.bash_profile文件 ...

  •  蓝韵文化传媒 什么电脑管理软件好电脑管理软件哪个最好

    以后无需安装氏戚QQ电脑管家就可以直接使用软件管理了。2、UU安全(手机软件管理)大小4.1MUU安全是一款非常方便的管理手机的应用,它的强大之处在于能够把导致电脑卡慢耗电的软件变成绿色版,控制其自动启动等功能。3、驱动人生软件管家大小5.9M驱动人生软件管家是款能够包含很多小软件的结合的工具,一些软件下载好之后可以...

  •  宝贝爱妳day mysql连接数据库之后怎么办

    第一个就是Port Number :3306。端口号默认3306,一般不需要改,如果改了,请记住这个端口号。第二个就是password:本地数据库密码,默认用户名是root 第三个就是Windows Service Datails:MySQL56,如果修改了请记住。(可以取消Start the MySQL Server at System Startup前面的勾,不然每次开机mysql就自...

  •  雨中花雨落 mysqli_query()至少两个参数。

    mysqli_query($conn,"SELECT * FROM uu");

  •  机器1718 node mysql the server closed the connection怎么办

    本人经验:常用加速器: 网易UU加速器(一般,没出现过什么太高延迟)、奇游加速器(相对稳定)、迅游加速器(一般)、雷神加速器(个人觉得挺辣鸡。。。)。 一般家庭网络或者网吧网络不是特别好的那种都有跳机卡顿通病, 因为地图在大面积的持续加载, 如果网络本身好加速器看起来都差不多。应该是...

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部