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
只能为非负数。