自增主键

  • MyISAM保存在文件
  • innodb保存在内存(重启后计算max(id)),mysql 8之后保存在redo log

image.png

自增锁AUTO-INC

image.png
语句回滚会导致自增主键不连续
image.png

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个。
image.png

【坑】自增值回溯问题

删除数据,重启数据库,再insert会重新使用之前的自增值。
5.7解决不了,8.0能解决。

8.0 auto_increment会持久化