为什么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来实现唯一性和索引。在应用中需要权衡主键生成方式和数据访问需求,并根据实际情况做出选择。