0 前言

自增主键是数据库中最常用的功能之一,这里简单介绍一下 MySQL 自增主键的内部原理、加锁方式以及临界值的处理方式。

1 内部原理

  • 自增主键并不会固化存储,每次 MySQL Server 启动都会进行初始化,然后存储在内存中。
  • 每次 insert 之前就会对这个数字进行 +1。
  • 自增主键初始化的方式为 select max(max(id), 1) from table_name。

2 加锁方式

  • 互斥锁:如果是一个没有指定 id 的 insert 时,只会在获取 id 时对自增主键加一个互斥锁,锁很短。
  • 事务全程锁:如果是一个指定 id 的 insert,则会在 insert 事务提交后才释放锁,自增主键被锁的时间是整个事务执行的时间。
  • 如果使用了 insert into xxx select * from yyy; 或者 load file xxx;,则自增主键锁会持续到语句执行结束,会阻塞普通的 insert,是一个风险点。

3 临界值

  • 默认从 1 开始,当达到该类型的 MAX_VALUE 之后就会不再自增,如果还有新的 insert 进来,就会产生主键冲突异常。
  • 可以通过 alter table AUTO_INCREMENT=value; 来指定自增主键,但 value 只能为非负数。