1、 为什么主键通常使用自增

在实际应用中,都推荐使用自增id作为数据表的主键,而不建议使用业务id,更不建议使用字符串
作为主键,这是为什么呢?
image.png
InnoDB底层的数据结构是B+Tree

主要原因有两个:
1)索引本身是有序的,再加上MySQL底层是以页为单位来存储数据的,一页写满继续写下一页。如果使用非自
增id,为了保证索引的有序性,每次插入都需要将数据移动到合适的位置,可能会造成页分裂,影响插入性能。

2)相对而言,字符串作为主键占用的空间大,而且字符串的比较更慢。

2、 自增锁

自增锁(Auto-inc Locks)是当向含有AUTO_INCREMENT列的表中插入数据时需要获取的一种特殊的表级锁

在最简单的情况下,如果一个事务正在向表中插入值,则任何其他事务必须等待对该表执行自己的插入操作,以便第一个事务插入的行的值是连续的。

  • 特殊的表级锁:insert出现在事务中,自增锁是在insert之后立即释放,而不是等事务提交才释放。

InnoDB还提供了参数 innodb_autoinc_lock_mode 用于设置自增锁模式,它可以对插入操作实现
性能与并发的平衡。

image.png

取值说明:
0:traditional,传统锁模式,语句级锁,保证值分配的可预见性、连续性、可重复性,保证主从复制的一致性。

1: consecutive,连续锁模式,锁在语句得到值后就释放,并发插入性能优于传统模式,MySQL 5.x默认模式

2:interleaved,交错锁模式,最快最具扩展性的模式,基于binlog的复制与恢复不安全,MySQL 8.0默认模式

auto_increment_increment : 自增初始值

auto_increment_offset : 自增步长
image.png