MySQL innodb_autoinc_lock_mode设置

https://www.jianshu.com/p/f72b7bfa7467

https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
国内的文章看得真是蛋疼,跟官网的文档意思差别太大。

insert 语句分类

insert 语句分三种类型:simple insert, bulk insert, mixed insert

  • simple insert
    insert 时可以预先知道插入的行记录数量。例如insert into t values(a), (b), 这个语句插入时,mysql就可以预先知道插入的行记录数量为2.
    insert ... on duplicate...语句不属于simple insert

  • bulk insert
    insert 时可以预先知道插入的行记录数量。
    例如load data语句、INSERT ... SELECT语句, REPLACE ... SELECT语句都属于bulk insert。

  • mixed insert
    simple insert中有一部分指定了AUTO_INCREMENT的值。这个官方文档说得不明白。看得也不是很明白。

innodb_autoinc_lock_mode

innodb_autoinc_lock_mode有三个值:

  • 0, traditional
  • 1, consecutive
  • 2, interleaved

traditional

这种模式下,所有的insert语句在开始时都会获得一个表锁autoinc_lock.该锁会一直持有到insert语句执行结束才会被释放。对于一条insert插入多个行记录的语句,他保证了同一条语句插入的行记录的自增ID是连续的。
这个锁并不是事务级别的锁。
在这种模式下,主从复制时,基于语句复制模式下,主和从的同一张表的同一个行记录的自增ID是一样的。但是同样基于语句复制模式下,interleaved模式,也就是innodb_autoinc_lock_mode=2时则不能保证主从同一张表的同一个行记录的自增ID一样。
这种模式下,表的并发性最低。

consecutive

这种模式下,insert语句在开始时会获得一个表锁autoinc_lock, simple insert在获取到需要增加的ID的量后,autoinc_lock就会被释放,不必等到语句执行结束。但对于bulk insert,自增锁会被一直持有直到语句执行结束才会被释放。
这种模式仍然保证了同一条语句插入的行记录的自增ID是连续的。
这种模式下的主从复制表现跟traditional模式下一样,但是性能会有所提高。

interleaved

这种模式下,simple insert语句能保证ID是连续的,但是bulk insert的ID则可能有空洞。
主从复制的同一张表下的同一行id有可能不一样。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章