1.自增id左主键
1)可靠性不高
存在自增id回溯的问题,mysql8.0修复
自增id回溯:
2)安全性不高
可以容易猜测用户id的值
3)性能差
自增id的性能较差,需要在数据库服务端生成
4)交互多
客户端需要执行额外一次类似last_insert_id的函数才能知道刚才插入的自增值,这需要多一次的网络交互,在海量并发的系统中,多1条sql,性能开销就会增加
5)局部唯一性
自增id时局部唯一,旨在当前数据库实例中唯一,而不是全局唯一,对于分布式系统难以处理
2.业务字段做主键
表数据:
使用卡号作为主键,卡号可能重复使用,不能作为主键使用
使用身份证号作为主键,比较合理,但身份证号不一定可以获取
结论:
使用业务作为主键时,想当然的认为了解业务需求,但实际情况往往出乎意料,而更改主键设置的成本非常高
3.淘宝主键设计
订单id = 时间+去重字段+用户id后六位
4.推荐的主键设计
非核心业务:对应表的主键自增id,如告警,日志,监控等
核心业务:主键设计保证:全局唯一+单调递增
推荐使用UUID:全局唯一,占用36字节,数据无序,插入性能差
UUID = 时间-UUID版本(16字节)-时钟序列(4字节)-MAC地址(12字节)
其中-占4个字节
改造UUID:时间高低位互换,则时间就是单调自增的了