本文将介绍两个问题:
- MySQL数据库为什么需要自增主键?
- 自增主键为什么是递增不连续的?
下面分别看下这两个问题
一、MySQL数据库为什么需要自增主键
MySQL常用的InnoDB存储引擎是使用B+Tree来维护索引的,通过B+Tree来维护索引的有序性,在插入新值时需要做必要的维护,以下图为例
如果新增ID列为700,则只需在R5后插入即可。如果新增加的是400,就相对麻烦了,需要逻辑上挪动后面的数据。有更糟糕的情况,如果R5所在的数据页已经满了,根据B+Tree的算法,这时需要申请一个新的数据页,然后挪动部分数据。这个过程叫做页分裂,在这种情况下,性能会受到影响。除了性能外,页分裂操作还影响数据页的利用率。原本放在一个页的数据,现在分到两个页,整体空间利用率降低大约50%。
当然有分裂就有合并,当相邻两个页由于删除数据,利用率很低之后,会将数据页做合并。合并过程,可以认为是分裂的逆向过程,所以一般情况下都是逻辑删除。
自增主键每次都是追加记录,不涉及挪动数据,也不会触发页分裂。这是自增主键的好处之一。
除了考虑性能,还需要从存储空间的角度来看。假如用其他比较长