前几天在面试的时候面试官问了我一个 uuid作为主键和自增主键的优缺点这个问题,面试的时候回答的并不好,不过面试结束后查询了很多资料的我给大家总结出来一些问题。
uuid作为主键
首先uuid 的全称叫做 :Universally Unique Identifier,是一种用于标识信息的128位数字,通常以32个十六进制数字的形式表示。UUID是一种全局唯一的标识符,用于确保在分布式系统中生成的标识符是唯一的,不会重复。UUID通常用于识别文档、消息、对象、实体等,以及在数据库、网络通信和其他系统中用于唯一标识实体的需求。UUID的生成算法保证了生成的标识符是唯一的,即使在不同的系统中生成也不会冲突。UUID的唯一性使其在大规模分布式系统中被广泛应用。
uuid 作为主键的优点:
1.作为主键保证了唯一性
2.在分表的时候大家基本上都会选用uuid或雪花算法作为主键,这样可以有效的避免了主键的冲突。
3.若使用uuid作为分表的分片键(当然一般不这么做),可以使数据在分表时更加平均地分布在不同的表中,有利于负载均衡。
uuid 作为主键的缺点
1.首先在innoDB引擎下,索引的底层是B+树,非叶子节点存储指针,只有叶子节点才会存储数据,一般主键也被叫做聚簇索引(索引值和数据是紧密相连的),如果使用uuid的话存储数据是无序的,这样查询效率会降低。
2.如果在中间页中插入新的数据或者是修改数据,因为uuid是无序的,因此可能会破坏底层B+树的结构,可能会发生页分裂,这样就大幅度的增加了与硬盘的IO,同时也会出现数据碎片化,数据在物理存储上的布局不再连续,这会影响查询性能。
3.由于现在的硬盘已经很便宜了,这里就简单说一下,uuid占用的内存要比较多,二级索引(非聚簇索引)会保存主键值(然后可能会进行回表查询等)这样一来就占用的空间比较多。
自增主键的优点
1.在单表中可以保证主键的唯一性,避免了数据的重复和冲突。
2.有数据库自己提供的,不需要程序员进行大幅度的干预。
3.提高查询和索引的性能。
4.节省空间,相比于uuid,它所占用的空间更少。
自增主键的缺点
1.在分布式系统或者分表的过程中可能会出现主键重复的问题,这样就会导致数据不一致。
2.容易暴露数据量,根据自增主键很容易判断出插入了多少数据。
3.限制扩展性:当需要将数据库扩展到多个节点或分片时,自增长字段可能会成为瓶颈,限制了数据库的扩展性。