mysql主键选择

mysql中用于唯一标识表中行数据的方式有哪些?项目中如何选择?你参与的项目中为什么选用这种方式?


 

自增ID

UUID

类型

整数型

字符串型

长度

固定长度(如MySQL InnoDB自动生成的ID为4字节,32位

32个字符(当前日期和时间、时钟序列、全局唯一的IEEE机器识别号)

唯一性

生成方式

数据库自动生成( 可以避免手动生成ID时出现错误,提高生成ID的准确性)

随机生成(当前时间、计数器和硬件标识等数据计算生成)

唯一标识范围

数据库记录级别

全球范围

插入速度

慢,数据会有碎片


 

查询速度

定位和寻址很快

顺序的每一条记录都存储在一条记录的后面。新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗,减少了页分裂和碎片的产生
 

IO问题

写入是乱序的,innodb不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上,由于频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片
 

性能问题


 

已经达到最大值,那么插入新数据时需要重新生成ID


 

随机生成的,所以会发生随机IO,影响插入速度,并且会造成硬盘的使用率较低


 

数据合并


 

数字类型,新老数据区分会出现一些冲突

新老数据合并,要是新数据主键也是数字类型,想新老数据区分会出现一些冲突
 

唯一性

适用场景

为了存储和查询效率选择

对于一些敏感数据,比如用户 id,订单 id 等,如果使用自增 id 作为主键的话,外部通过抓包,很容易可以知道新进用户量,成单量这些信息,所以需要谨慎考虑是否继续使用自增主键。
 

分布式系统

重复率

你可能感兴趣的:(mysql)