为什么用与业务无关的自增id作为mysql主键

业务无关的自增id作为数据库主键

一、自增id必要性

1、若使用业务相关的唯一标识做主键,小概率可能会因为业务场景的变更,此时的被认定为业务唯一标识的字段不唯一。

2、对于InnoDB来说,主键索引是聚簇索引,叶子节点存储主键索引行记录。自增主键索引新增行记录在最后一个叶子节点页尾部插入,是顺序写磁盘;而非自增主键索引将产生页的重排分裂和频繁随机io写磁盘,降低数据行写入效率。

3、对大表做遍历,一次读取数据条数不宜过多,避免大数据直接进入老年代、导致fullgc。涉及深分页可以基于顺序唯一索引做排序,基于上一次查找的最后一条记录索引值
查找下一批次记录行。

二、不指定主键索引

如果没定义主键,则会使用非空且唯一的字段,默认为作为主键。不存在则使用内置全局6个字节长度的行标ROWID作为主键。

三、b+树三层索引存储千万行记录数据

InnoDB使用b+树,原因是数据持久到磁盘存储。为了避免频繁的磁盘io,导致内存读取磁盘页的频繁换出,大大降低计算性能。使用b+树存储千万数据仅需做3次磁盘io。

具体分析

1、操作系统都是按页读取磁盘到内存,从一定程度上可以把内存页看作是磁盘数据的缓存。innodb默认一次读取磁盘数据页大小16kb。
2、假设一个索引项构成:主键数据(8byte)+指针(6byte,64位操作系统其中低48位做指针、而高16位预留。GC垃圾回收器,低停顿的垃圾回收 染色),那么一个索引项需要14byte。16kb至少可以存1000索引项。那么b+树二层非叶子节点索引可存10001000=100w索引项。
3、假设一行记录占用空间1kb,16kb则可以存储16行数据。那么3层b+树索引(两层存储索引项、一层存储行数据),可以存储100w
16=1600w数据行,即3次磁盘io即可找到目标数据行。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值