最近有小伙伴问博主关于主键ID的选取问题(UUID与自增ID)。我简单的总结一下;
如果站在数据库层面上,就拿mysql举例吧。默认采用的Innodb索引。
1.字段长度方面对比
博主在上一篇中也讲到了索引选取时候应该选择短的字段作为索引来降低索引的大小,这样在一个磁盘分片中可以存储更多的索引量,同样的缓存大小,可以容纳更多的索引量,从而加载的速度就会加快。从这个角度看自增ID的优势要大于UUID的。
2.索引维护方面
自增ID在插入数据时候需要维护的是最右侧的,也就是最大节点。除了到达max degree外,都只需要维护一个节点即可。如果是UUID由于位置不确定性,所以在插入一个索引的时候可能需要多个索引一起变动,维护成本比较高。如下图简析;从这个角度看自增ID的优势要大于UUID的。
3.业务安全(保密)性
用在订单号的号,由于自增ID很容易看出当天的销量,对竞争对手,或者消费者都会轻易的知道销量。竟业方面都用自增ID肯定不合适。这方面UUID比自增ID要占优势。如果费用要自增ID也是可以的,可以给固定的前缀等混淆视听即可。
4.分布式数据库方面
分布式数据库中如果用到了分表分库,很显然全局唯一ID是非常重要的。UUID不需要做任何处理即为全局唯一ID。而自增ID需要通过一张唯一的表来获取后使用,代码层面会稍微复杂一点。这方面看UUID比较便捷,并且可以保证绝对唯一。
总结:
综上所述关于UUID与自增ID的选取要根据实际的情况来判断。如果重视数据库性能,可以通过对自增ID的增强来实现。如果数据库不是瓶颈且为了更简单的编码,可以使用UUID。不过博主不太主张用UUID,毕竟写代码要考虑全局,顾全数据库,方便后期业务量增加后方面优化扩展代码。