MySQL-20丨主键为什么设置成自增

Posted by jiefang on November 1, 2019

主键为什么设置成自增

主键和聚集索引

  • 在 InnoDB 中,聚集索引不一定是主键,但是主键一定是聚集索引:原因是如果没有定义主键,聚集索引可能是第一个不允许为 null 的唯一索引,如果也没有这样的唯一索引,InnoDB 会选择内置 6 字节长的 ROWID 作为隐含的聚集索引
  • InnoDB 的数据是按照主键顺序存放的,而聚集索引就是按照每张表的主键构造一颗 B+ 树,它的叶子节点存放的是整行数据
  • 每张 InnoDB 表都有一个聚集索引,但是不一定有主键。

主键是否需要设置为自增

聚集索引是按照每张表的主键构造一颗B+树的,而B+树中,所有记录节点都是按键值的大小顺序存放在同一层叶子节点上。

如果每次插入的数据都是在聚集索引树的后面,聚集索引不需要分裂就可以存入数据。

但是如果插入的数据值在聚集索引树的中间部分,由于要保证插入后叶子节点中的记录依然排序,就可能需要聚集索引树分裂来保证键值的有序性。

image

如果主键是随机的,那么写入数据时可能会导致数据页频繁分裂,从而导致写入效率低和页空间浪费

如果设置主键自增,那么每一次都是在聚集索引的最后增加,当一页写满,就会自动开辟一个新页,不会有聚集索引分裂这一步,效率比随机主键高很多

当然也不是所有的表都需要设置为自增,如果通过业务逻辑给到表主键的值是增长的(不一定连续),保证了新写入数据的主键值比之前大,也可以避免聚集索引树频繁分裂。这种方式也是可以选择的。