为什么MySQL不推荐使用UUID(mysql不推荐uuid)

为什么MySQL不推荐使用UUID?

在MySQL中,UUID是一种常见的主键生成方式。但是,MySQL并不推荐使用UUID作为主键,这是为什么呢?

一、UUID的生成过程

UUID是指通用唯一识别码(Universally Unique Identifier),其由16个字节组成,通常表示为32个十六进制数字。在MySQL中,UUID可由函数UUID()生成。UUID的生成过程基于以下三个因素:

1. MAC地址

第一部分为时间戳,其基于系统对时钟的计时。第二部分为该计时器的MAC地址的散列值。MAC地址在生产过程中会被烧录进网络硬件中,因此是唯一的。

2. 时间戳

第一部分为时间戳,表示当前时间,以1/10微秒(100纳秒)为单位的格林尼治时间(GMT)。

3. 随机数

为了保证UUID是唯一的,最后8个字节是随机生成的。

二、UUID在MySQL中的问题

1. 索引效率

UUID由32个字符组成,且为无序的。将其用作主键会导致索引效率低下,因为每个UUID都相当于都是随机的,而B树索引的大多数操作都是在有序数据集合上执行的。

2. 存储空间

UUID所占用的存储空间更大,为而对比自动递增的整数类型,存储效率更低。

3. 碎片问题

UUID是无序的,不像自增ID那样可以连续插入,会造成数据的碎片化问题。当B+树出现大量的碎片时,读取索引节点的操作IO访问次数增加,造成索引IO成本增加,一般会大于自增。

三、解决方案

1. 整数自增

MySQL推荐使用整数自增作为主键,可以减小存储空间,提升索引效率。

2. 组合键

使用组合键可以拼接出一个主键,实现唯一性和索引,但要保证组合键的唯一性。

CREATE TABLE example (
id INT(11) NOT NULL AUTO_INCREMENT,
sub_id INT(11) NOT NULL,
PRIMARY KEY (id, sub_id)
);

3. UUIDv4

如果应用中必须使用UUID作为主键,MySQL推荐使用UUIDv4,这是一种基于随机数生成的UUID版本,能够有效降低碎片问题的出现概率。

CREATE TABLE example (
id CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
PRIMARY KEY (id)
);

四、总结

MySQL不推荐使用UUID作为主键,由于其不利于索引效率、存储空间和碎片问题的缘故。MySQL推荐使用整数自增作为主键,也可以使用组合键和UUIDv4来实现唯一性和索引。在应用中需要权衡主键生成方式和数据访问需求,并根据实际情况做出选择。


数据运维技术 » 为什么MySQL不推荐使用UUID(mysql不推荐uuid)