innodb_autoinc_lock_mode 0,1,2 的实际区别是什么

Man*_*noj 5 mysql innodb

当给出并行加载数据 infiles 时,我想了解 innodb_autoinc_lock_mode 选项 0,1 和 2 之间的区别。

我在“0”选项中看到,它锁定整个表并执行请求 N 条记录的第一个事务,例如 TX1。因此,当下一个事务说 TX2 同时引发时,当第一个事务仍在使用“加载数据”上传时,它必须在队列中等待第一个 TX1 完成。然后它从表中设置 max(AI_column)+1 值并为下一组加载数据上传。在这种情况下,它不会跳转自动增量数字。

另外我在“1”选项中看到,它锁定整个表并执行请求 N 条记录的第一个事务,比如 TX1。因此,当下一个事务说 TX2 同时引发时,当第一个事务仍在使用“加载数据”上传时,它必须在队列中等待第一个 TX1 完成。然后它从表中设置 max(AI_column)+1 值并为下一组加载数据上传。然后它设置 max(AI_column)+some_creepy_jump。

但是我在“2”选项中看到,它没有锁定整个表。相反,它同时为每个进程保持插入,并为任何请求随机插入记录,并以平均时间结束所有线程(7 个并行线程使用 1000000 条记录的负载数据为 1.21 秒)。在这种情况下,它有多个混合顺序的事务。然后它设置 max(AI_column)+some_creepy_jump atlast。

我正在使用 mysql 5.1.61 。

  • 我的问题是选项 1 的用途是什么?
  • 为什么它仍然是 Mysql 5.1.22 的默认更高版本?
  • 有没有人用选项 2 遇到过任何灾难?

由于我的项目需要使用表的加载数据进行多个进程。我已经测试了上述选项并最终选择了选项 2。如果我的实验有误,请纠正我。

小智 3

您使用什么复制方法?选项 2 适用于基于 ROW 的情况,但对于 STATMENT 复制,从属设备上的 auto inc 值不能保证相同。

选项 2 还意味着您的 auto inc 值可能不会连续,但这对您来说可能并不重要。

选项 1 是默认选项,因为它是基于 STATEMENT 的复制的最安全方法(我认为这是默认选项)。它比选项 0 更具可扩展性,因为它只为批量插入执行表级自动增量锁,但它仍然提供连续的自动增量值,没有间隙。有些人依赖这种行为。

听起来对于您的用例来说,只要您的复制设置没问题,您就可以选择所选择的设置。

希望有帮助。