存储位置
自增值为什么不能回退(性能考虑)?
如果回退,需要使用以下2种思路,都会导致性能问题.
- 遍历全表,找到最大值
- 自增id的锁范围扩大,必须等到一个事务执行完成并提交,下一个事务才能再申请自增id
自增锁优化(申请自增值加锁,避免竞争)
建议配置成innodb_autoinc_lock_mode=2并且 binlog_format=row
innodb_autoinc_lock_mode:
0. 语句执行结束后才释放锁
- 普通模式
1.1 普通insert语句,自增锁在申请之后就马上释放
1.2 类似insert … select这样的批量插入数据的语句,自增锁还是要等语句结束后才被释放
为什么批量插入要等语句执行完?保证数据一致性. 避免主从库执行的语句获取到的id不一样 - 所有的申请自增主键的动作都是申请后就释放锁