此处英文原句为:Usage Implications, 但是我觉得这里的implications不是“暗示”的意思,而是“使用的影响”的意思,所以我将其翻译为“使用小贴士”。
副本中的自增id #
如果你使用的statement-based的复制,请将innodb_autoinc_lock_mode设置为0或1。如果将其设置为2,或者说副本和主库的设置不一致,那么副本中的自增id 可能会和source中的不一致。
如果你使用复制模式是row-based或者mixed,那么所有的自增锁模式都是安全的,因为在row-based复制中,SQL执行的顺序不会影响到自增id的值。
缺失的自增id #
无论使用的哪种模式,如果事务进行了回滚,那么其产生的自增id值就丢失了。一个自增列一旦产生值,就不能回退。所以,自增列可能会有间隙。
自增列指定为null或0 #
在三中锁模式中,如果用户在insert语句中为自增列指定的值是null或0,InnoDB都会为其产生一个新的自增id。
为自增列指定负值 #
无论你采用哪种模式,如果你给自增列指定了负值,那么自增机制的行为将是不确定的。
自增列的值超过了最大值 #
无论你采用哪种模式,如果自增列的值超过了最大值,那么自增机制的行为将是不确定的。
批量插入时的间隙 #
在传统模式或连续模式下(0 or 1),因为表级别的AUTO-INC锁一直到语句执行完才会被释放,同一时刻只有一个持有锁的语句在执行,所以在批量插入时,是没有间隙的。在交叉模式下(2),如果同时有多个插入语句(INSERT-like)语句执行,则批量插入可能会产生间隙。
混合模式插入(mixed-mode inserts)产生的自增id值 #
如果一个简单插入语句中插入了多条记录,却只为其中部分记录指定了自增列的值,那么三种锁模式产生的结果是不一样的。 此处可以参见官方文档中的例子。
修改自增列的值 #
在MySQL5.7及之前,如果在连续的insert语句执行过程中修改自增列的值,可能会产生 “Duplicate entry” 错误。从MySQL8.0开始,如果将现有记录的自增 列修改为比现有的最大值还大的值,那么后续的insert操作分配的自增值将会比修改后的值更大。