自增主键
- MyISAM保存在文件
- innodb保存在内存(重启后计算max(id)),mysql 8之后保存在redo log。
自增锁AUTO-INC
innodb_autoinc_lock_mode:自增锁模式
默认值1
- 0(使用AUTO-INC锁):执行语句结束才释放
- 2(轻量级锁):所有都是马上释放【锁粒度小,批量插入不连续】
- 如果binlog_format是statement会有主从数据不一致问题
- 1(两种锁混用):
- 普通 insert 语句,自增锁在申请之后就马上释放;
- 类似 insert … select 这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放;
建议是innodb_autoinc_lock_mode=2配合binlog_format=row,既能提升并发,又没有一致性问题。
批量申请id策略优化
第一次1个id,第二次2个,第三次4个。
【坑】自增值回溯问题
删除数据,重启数据库,再insert会重新使用之前的自增值。
5.7解决不了,8.0能解决。
8.0 auto_increment会持久化。