存储位置

  1. MyISAM引擎 写在文件上
  2. innodb记录在内存中 <=5.7
  3. 新增持久化能力(记录在redolog) >=8.0

自增值为什么不能回退(性能考虑)?

如果回退,需要使用以下2种思路,都会导致性能问题.

  1. 遍历全表,找到最大值
  2. 自增id的锁范围扩大,必须等到一个事务执行完成并提交,下一个事务才能再申请自增id

自增锁优化(申请自增值加锁,避免竞争)

建议配置成innodb_autoinc_lock_mode=2并且 binlog_format=row
innodb_autoinc_lock_mode:
0. 语句执行结束后才释放锁

  1. 普通模式
    1.1 普通insert语句,自增锁在申请之后就马上释放
    1.2 类似insert … select这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放
    为什么批量插入要等语句执行完?保证数据一致性. 避免主从库执行的语句获取到的id不一样
  2. 所有的申请自增主键的动作都是申请后就释放锁