自增ID、雪花ID与UUID作为数据库主键的优劣对比
自增id,雪花id,uuid作为表的主键,分别有什么优缺点
- 自增id:
优点:性能最好,每次有新记录插入表中,都是顺序写入磁盘,页分裂少,写入效率高,且更省空间,占用内存小
缺点:在分布式环境下,如果多张表都要保证唯一且递增,实现起来很麻烦
会暴露业务信息,容易被人猜到数据总量和增量,存在一定的安全风险
高并发下可能会有竞争,自增锁可能会成为瓶颈
- 雪花id:
优点:全局唯一,在分布式系统中,可以保证跨数据库,跨表的id唯一
由于随机生成时包含时间戳,整体呈递增趋势,对MySQL聚簇索引性能影响较小
可以反解出生成时间和机器号,便于排查问题
缺点:长度较大,占用空间较多
如果服务器时钟回拨,可能会产生id冲突
- uuid:
优点:生成简单,全球唯一
缺点:无序性,uuid完全随机,新数据插入表中,为了维护b+树的有序性,无法顺序写入磁盘,导致大量页分裂
占用空间较大
总结
对于单体应用,优先推荐使用自增id作为主键,因为它既不占用大量内存,也能保证主键的唯一,写入磁盘时也比较方便
对于分布式应用,优先推荐使用雪花id,因为分布式应用通常会设计分库分表,如果要保证多个表和多个库中的id唯一,就必须使用雪花id