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有可能不一样。
网友评论