create at 20210921
modify at
这个问题的来源是主键生成策略,当你回答主键生成策略有:uuid、雪花算法、自增,下一个问题90%就是uuid有什么缺点,这个问题的答案就是uuid太长了
前提
面试官在问这个问题时都会带上前提:MySQL数据库 InnoDB存储引擎
详解
InnoDB存储引擎使用聚集索引,数据存在聚集索引上,其它索引的每个节点都需要存对应的主键,以此找到数据
MySQL的索引是存在内存中的缓冲区中(buffer pool);写表中数据时,写的结果先缓存在缓冲区,在某个时间批量写入磁盘,而不是直接写入磁盘
主键过长时会使得索引(聚集索引和其它索引)体积增大,导致MySQL缓冲区中可以存的索引变少,数据量大时,索引不能被完整地存入内存中的缓冲区,导致频繁访问磁盘
举个例子
使用的是InnoDB存储引擎,用uuid作为主键的话,每个主键需要16byte,而雪花算法只要8byte,如果表中数据量10万,该表建有2个唯一索引和一个主键,则使用uuid要多花费8byte * 10w * 4 = 320w byte = 3MB, 这只是1个10万条数据的表多花费的内存空间,如果有50张百万数据的表就得多花1500MB内存,当数据量大、建的索引多,就会导致操作系统无法给mysql的缓冲区提供足够内存来存所有的索引,进而导致频繁访问磁盘