基本概念与功能
1、主键自增ID
优点:主键自增ID的主要优点在于其简单易懂的特点,几乎所有的数据库系统都支持这种自增类型的主键,它的值以近乎顺序的方式填写,能够提升页的利用率,使得索引更加紧凑,查询性能更好,同时还能节省存储空间,连续增长的值可以避免B+树频繁的合并和分裂,这对于数据库的性能优化至关重要。
缺点:自增ID的缺点也同样显著,它的可靠性不高,存在自增ID回溯的问题,直到MySQL 8.0版本才得到修复,对外暴露的接口容易被猜测,造成安全性问题,自增ID的性能较差,特别是在高并发的环境下,会产生明显的锁争用,业务还需要额外执行一次类似last_insert_id()
的函数才能知道刚才插入的自增值,这需要多一次的网络交互,增加了性能上的开销,最重要的是,自增ID只在当前数据库实例中唯一,而不是全局唯一,这对于分布式系统来说是一个严重的缺点。
2、UUID作为主键
介绍:UUID(Universally Unique Identifier)是一种全局唯一的标识符,它可以保证在空间和时间上的唯一性,UUID通过MAC地址、时间戳、命名空间、随机数、伪随机数来保证生成ID的唯一性,有着固定的大小(128bit),在MySQL中,UUID的组成包括时间低位、时间中位、时间高位,以及时钟序列和MAC地址,UUID可以在不需要注册过程的情况下产生,既可以短时间内标记一个对象,也可以可靠地辨别网络中的持久性对象。
优点:UUID作为主键的最大优点是保证了全局唯一性,解决了自增ID在分布式系统中的问题,UUID更加安全,因为它的不可预测性,可以防止外部接口被猜测的风险。
缺点:UUID的缺点包括无序、随机生成带来的聚集索引频繁页分裂、大量随机IO和内存碎片化的问题,特别是随着数据量的增加,插入性能会越来越差,UUID占用36字节,相比于自增ID来说,比较浪费存储空间。
3、有序UUID作为主键
介绍:为了解决传统UUID无序性带来的性能问题,MySQL 8.0提供了uuid_to_bin
函数,可以将UUID转换为有序的二进制格式,从而提升性能,这种有序UUID既保持了全局唯一性,又通过单调递增改善了性能。
演示使用:在MySQL 8.0中,可以通过uuid_to_bin(@uuid,true)
将UUID转化为有序UUID,这样,全局唯一+单调递增的特性就成为了理想的主键选择,使用binary
数据类型来存储二进制字符串,并使用hex()
和unhex()
函数进行二进制和十六进制字符串之间的转换。
应用场景与性能考量
1、自增ID的适用场景:自增ID适用于单机数据库应用,数据量较小,对存储空间敏感,且不需要跨服务器合并数据的场景,它的简单和高效是其主要优势。
2、UUID的适用场景:UUID更适合于需要在网络中标记对象,或者在分布式系统中作为主键使用,它的唯一性和安全性使其成为大型分布式系统的理想选择。
3、有序UUID的适用场景:有序UUID在保持了UUID全局唯一性的优点的同时,通过有序性提升了索引性能,适用于对性能要求较高且数据量大的分布式系统。
4、性能考量:自增ID在查询性能上优于无序UUID,但在高并发写入和分布式环境下不如UUID,有序UUID在这两者之间提供了一个平衡点,既保证了性能,又解决了分布式系统中的唯一性问题。
自增ID、UUID和有序UUID各有优缺点,适用于不同的应用场景,选择合适的主键取决于具体的应用需求、系统架构和性能考量。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/836987.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复