Mysql数据库主键自增类型和uuid优缺点及对比
十月 31, 2018
项目中表结构同时存在了自增id和uuid,为此特意网上搜索了一番在各种场景下使用自增id好还是uuid好,按说自己测试一遍是最好的,无奈我mac本内存不是很宽裕,数据量小了也看不出效果,所以借鉴别人的一些经验,十分感谢。
表准备
- 自增主键
1 | CREATE TABLE `UC_USER` ( |
- uuid
1 | CREATE TABLE `UC_USER_PK_VARCHAR_1` ( |
数据测试结果对比
500w数据
普通单条或者20条左右的记录检索,uuid为主键的相差不大几乎效率相同;
但是范围查询特别是上百成千条的记录查询,自增id的效率要大于uuid;
在范围查询做统计汇总的时候,自增id的效率要大于uuid;
在存储上面,自增id所占的存储空间是uuid的1/2;
在备份恢复上,自增ID主键稍微优于UUID。
1000w数据
普通单条或者20条左右的记录检索,自增主键效率是uuid主键的2到3倍;
但是范围查询特别是上百成千条的记录查询,自增id的效率要大于uuid;
在范围查询做统计汇总的时候,自增id主键的效率是uuid主键1.5到2倍;
在存储上面,自增id所占的存储空间是uuid的1/2;
在写入上面,自增ID主键的效率是UUID主键的3到10倍,相差比较明显,特别是update小范围之内的数据上面。
在备份恢复上,自增ID主键稍微优于UUID。
分布式架构下选择
自增主键 + 步长适合中等规模
比如有n个节点,第i个节点的配置:
1
2
3
4# 参数可以在my.cnf中设置
# 也可以在连接命令行中使用SHOW VARIABLES LIKE 'auto_inc%'查看,SET @@auto_increment_increment=n修改
auto_increment-offset=i
auto_increment_increment=n
> 优点:实现简单
> 缺点:第一次设置要根据业务规划节点和步长,不易扩展(扩展要修改步长,之前的数据无法兼容)
uuid适合小规模
优点:简单,不需要考虑id唯一性
缺点:与自增主键相比,占用几乎两倍的空间,数据量大的时候读写性能下降
Twitter雪花算法全局唯一自增id
大规模的分布式场景需要考虑扩展,性能等问题,雪花算法十分适合。
总结
单实例
首选自增主键
分布式
- 20个节点组下的小型规模的分布式场景,为了快速实现部署,可以采用多花存储费用、牺牲部分性能而使用UUID主键快速部署;
- 20到200个节点组的中等规模的分布式场景,可以采用自增ID + 步长的较快速方案;
- 200以上节点组的大数据下的分布式场景,可以借鉴类似twitter雪花算法构造的全局自增ID作为主键。