文章

Mysql主键选取

主键用数字还是UUID?

UUID 是通用唯一识别码的缩写,其目的是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。在数据库集群中,为了避免每个MySQL各自生成的主键产生重复,所以有人考虑采用UUID方式。

image-20240421164330038

为什么有人想要使用UUID

在数据库集群中,为了避免每个Mysql各自生成的主键产生重复,所以有人考虑采用UUID方式。

使用UUID的好处

  • 使用UUID,分布式生成主键,降低了全局节点的压力,使得主键生成速度更快
  • 使用UUID生成的主键值全局唯一
  • 跨服务器合并数据很方便

UUID主键的缺点

  • UUID占用16个字节,比4字节的INT类型和8字节的BIGINT类型更加占用存储空间
  • UUID是字符串类型,查询速度很慢
  • UUID不是顺序增长,作为主键,数据写入IO随机性很大

主键自动增长的优点

  • INT和BIGINT类型占用存储空间较小
  • MySQL检索数字类型速度远快过字符串
  • 主键值是自动增长的,所以IO写入连续性较好

无论什么场合,都不推荐使用UUID作为数据表的主键,而是要利用数据库中间件来生成全局主键

分布式ID方案开源组件参考

UidGenerator是百度开源的一款基于 Snowflake的唯一 ID 生成器,是对 Snowflake进行了改进

​ GitHub:https://github.com/baidu/uid-generator

Tinyid是滴滴开源的一款基于数据库号段模式的唯一 ID 生成器。

GitHub: https://github.com/didi/tinyid

Leaf是美团开源的一个分布式 ID 解决方案。提供了号段模式 和 Snowflake这两种模式来生成分布式 ID。

Leaf 设计文档: https://tech.meituan.com/2017/04/21/mt-leaf.html

GitHub:https://github.com/meituan-diaNPing/leaf

License:  CC BY 4.0