自增索引的优点
主键ID生成方案
- 数据库自增
- 随机数 --->twitter雪花算法
- UUID--->UUID生成器
写入数据速度比较
继续插入30万数据:
总体时间占用排名:自增ID > 雪花算法随机ID > UUID
自增ID规则
- 主键值是顺序的,存储引擎将记录存放到其他记录之后
- 达到页面最大填充因子的时候(默认15/16,剩下的空间留作备用,以便修改):
- 将新记录写入到新的一页,好处是页面按顺序填满提升了存储效率
- 记录新行的位置在最大行数据之后,定位寻址快,减少了计算
- 若使用了二级索引,由于二级索引的叶子节点记录的是主键ID,相对减少了普通索引占用的空间
UUID规则
- 主键无序,插入位置不固定,意味着下面的问题:
- 插入位置不固定定位寻址相较要消耗更多时间
- 写入目标页很可能不在缓存中,需要从磁盘读取目标页到缓存增加了大量随机IO操作
- 写入位置乱序可能导致写入目标页已经满了,需要页分裂操作,一是数据移动操作消耗资源;二是页分裂间接又降低了页的空间利用率
- 页的数据稀疏碎片化,如果使用
OPTIMEIZE TABLE
来重建优化表有需要时间消耗
总结
- 自增型的缺点:
- 自增ID容易暴露业务数据
- 高并发下再按主键进行插入时锁争用会导致主键上界成为争抢的热点(间隙锁竞争),而UUID分散了锁的争抢(类似于原子类和LongAdder?)
- 不适合分布式系统
- 业务量小推荐自增ID,业务量大或分布式系统推荐雪花算法生成的随机ID