Innodb为何选择自增主键为主键?自增主键并发问题

Innodb的索引文件是按照主键聚集的,因此Innodb必须包含主键,一般选择自增字段作为主键

为什么选择自增主键?

自增主键优势:
每次插入新的记录,记录会按顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
非自增主键弊端:
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。

自增主键并发问题?

原理:
自增列使用AUTO_INC Locking方式来实现,即采用一种特殊的表锁机制来保证并发插入下自增操作依然是串行操作,为提高插入效率,该锁会在插入语句完成后立即释放,而不是插入语句所在事务提交时释放。
问题:
并发性能太差,尤其在大批量数据在一条语句中插入时(INSERT SELECT ), 因无法知道插入数据的具体行数,会导致该语句长时间持有这个“表锁”,从而阻塞其他事务的插入操作
问题解决方案:
MYSQL 5.1.22版本开始,InnoDB存储引使用一种轻量级互斥锁(Mutex)来控制自增列增长,并提供innodb_autoinc_lock_mode参数来控制。
当innodb_autoinc_lock_mode=1时,插入前知道插入的记录数量,MySQL通过轻量级互斥锁来控制INSERT操作获取自增值的过程,并在INSERT操作获取到自增值后快速释放互斥锁,通过降低锁颗粒度和锁持续周期,避免长时间持有表级别锁,提高并发。

你可能感兴趣的:(Innodb为何选择自增主键为主键?自增主键并发问题)