MySQL数据库--关于表中主键选择的相关问题

80 阅读1分钟

一. 为什么不推荐使用数据库自增主键?

  1. 采用自增主键加大数据库压力,并且业务层无法拿到新生成的ID。
  2. 分布式场景下容易造成主键冲突
  3. 无法进行数据库的水平扩展(比如电商平台在双11和618的数据量会激增这时平台方会增加数据库来应对)

二. 如果使用uuid作为主键会有什么问题?

  1. 生成的字符串太长, 主键作为数据的唯一标识多次重复存储的可能性很大, 空间占用大
  2. uuid无序随机生成, 太过杂乱, 主键最好要是递增的
  3. 有些版本的算法不完善, 会有一些问题(但我不太清楚)

三. 雪花算法作为业务主键有什么优缺点?

雪花算法: 时间戳+机器码(保证不同服务器不会有相同主键)+序列号(防止同一服务器1毫秒内生成多条数据导致主键相同)

时间戳可能因为机器出现误差(电信号异常)导致时钟回拨(下一秒比上一秒相同甚至早); 可以做一个判断来报异常或者sleep几毫秒来解决

要进行时间校准, 留给时间戳的位置只有41位, 而时间戳有64位(时间戳一般是用long记录的), 我们可以不必从1970年1月1日开始, 记录一个初始值, 从初始值开始, 当前时间戳减去初始值就可以得到了

  1. 全局唯一

  2. 趋势递增

  3. 信息安全

  4. 不能单调递增