Mysql主键自增优点

Posted by KANG's BLOG on Thursday, March 10, 2022

Mysql主键自增

优点

不用担心主键重复

数字型占用空间小,尤其是二级索引,跟容易命中内存

提高内存命中率

顺序存放在磁盘上,减少页分裂,进而节省磁盘空间

由于b+树的结构,子叶节点为双向链表,所以范围查询非常快

缺点

手动插入ID复杂,容易主键冲突,新老系统并行时,新旧表之间难以双向同步

分表后,数据导入新表需要控制主键

主键乱序插入的性能问题

B+树上,叶子结点是顺序存放的,也就是说,每一个页内数据是顺序的,相邻页的数据也是顺序的,那么随机插入时会出现如下的问题,我们以每个月能存放3条数据为例,假设当前数据时这样的[1,4,6,9,11,12],树结构图1所示:

(图1)

但如果这个时候插入2,[1,4,6]这个页则需要页分裂的同时,还会发生数据迁移,把数据6移动到分裂出新页中。而数据迁移的成本是非常高的。

(图2)

而且,innoDB存储叶子节点的时候,相邻的页通常会存在一个同一个页段中,而新增的页在页段中会顺序存放,如图3所示,所以从4向后访问6的时候属于随机读写,相比顺序读写成本又高了很多。

(图3)

总结:

  1. 乱序插入时,页分裂的同时,还有可能发生数据迁移
  2. 乱序插入时,页段中的新增页可能并非数据顺序导致磁盘的随机读写