MySQL中不建议使用UUID作主键的原因?

MySQL

1个回答

写回答

14751281520

2026-02-14 12:37

+ 关注

MySQL
MySQL

在设计MySQL数据库表时,主键设计是必定要考虑的。MySQL官方倡导别用uuid或者不连续且不重复的雪花id,而是推荐连续自增的主键id,即auto_increment。那为何不建议用uuid?uuid到底存在哪些弊端?MySQL数据库表用于存储关系型结构化数据,必然会提供数据的增删改查(CRUD)操作。在查询时,若未建立索引,MySQL只能从首行开始读取全表来查找相关行,表越大成本越高。而建立索引后,MySQL就能依据索引文件迅速定位到数据文件中的查找位置,无需查看全部数据。MySQL的索引大体包括主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)以及全文索引(FULLTEXT)。其中,主键索引较为特殊,属于唯一索引的一种,它是不允许存在空值的。MySQL里索引怎样起作用?先来看看MySQL的执行流程:

数据交互都要经由引擎服务,MySQL常见引擎有MyIsam和InnoDb,二者差异在此就不阐述了。InnoDB有两个存储文件,其后缀分别为.frm与.idb。.frm为表的定义文件,.idb是表的数据文件。InnoDB引擎的索引结构为B+Tree,主键的叶子节点存储该行数据,其余索引都指向主键。

InnoDB管理的最小单元是页,常见类型有FSP_HDR、INODE、INDEX等。页结构包含文件头(前38字节)、页数据和文件尾(后8字节),每个数据页的大小为16kb,其结构如下:

系统从磁盘读取数据到内存是以磁盘块(block)为基本单位的,同一个磁盘块的数据会被一次性读出。block的空间大小通常小于16kb,所以innodb每次进行io操作时,都会把若干地址连续的磁盘块数据读入内存,达成整页读入内存。MySQL写入数据时,数据会被存于索引页。若以UUID作主键,新行主键值未必比旧的大,innoDb就不能总是把新行插到索引而要给新行找合适位置分配新空间,这一过程会造成:使用自增主键能避免上述问题。结论:用innodb时,应尽量按主键自增顺序插入,且插入新行时尽可能采用单调递增的聚簇键值。

举报有用(6分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号