主键ID主要有:
数据库自增主键
uuid
雪花ID
数据库的自增主键:
从大学做实验开始就一直用自增主键,以前也没考虑过用自增主键有啥问题,直到工作后…
(1)首先自增主键不适用于分库分表情况,在做数据集合的时候会出现主键重复问题,做多个系统的数据汇总也会有冲突
(2)其次,详情…删除…查询…这些接口如果都是依赖着自增主键做操作,很容易有安全性问题(这是测试同学做渗透测试的时候告诉我的),同时很容易造成越权(掌握你自增主键的规律然后一定程度上越过某些校验获取数据)
所以以后再给我好好设计数据库的话,我都不会再用自增做主键了……
uuid:
uuid用过一段时间,它能解决自增id的安全性和数据汇总时候的问题,但是效率不高,后来优化的时候取消了…
(1)uuid首先会比较长,为保证唯一性长度肯定比自增id长很多,批量提交,批量删除,批量查询的时候,list会非常大,传输数据这么大,对性能和带宽都会造成一定影响,get请求拼接在url上的话,过长甚至会被浏览器截断,url看上去也会很丑
(2)最最重要的是,它是完全乱序的,新增一条新数据可能会打乱整棵索引树结构,它做主键索引也比自增ID做的主键索引占更大的空间
雪花ID:
它解决了以上两者的问题,首先它长度可以自定义限制,通过时间戳+机器号或者业务表单id+自增ID这样可以保证有序性
怎么用?
自己写规则生成也行,只不过我们项目用的mybatis plus ,已经自带了,所以直接在你自己的实体类中调用一下setId方法:
同时在实体类对应的id上加注解
结果:
IdWorker.getId() 方法跟进去简单看一下源码:
public synchronized long nextId()