innodb_autoinc_lock_mode参数可以设置为0,1,2,其代表的含义如下: 1、设置为0 这个表示tradition (传统模式) 2、设置为1 这个表示consecutive (连续模式) 3、设置为2 这个表示interleaved (交错模式)
innodb_autoinc_lock_mode =0
在这一模式下,所有的insert语句(“insertlike”) 都要在语句开始的时候得到一个表级的auto_inc锁,在语句结束的时候才释放这把锁,注意呀,这里说的是语句级而不是事务级的,一个事务可能包含有一个或多个语句。它能保证值分配的可预见性,与连续性,可重复性,这个也就保证了insert语句在复制到slave的时候还能生成和master那边一样的值(它保证了基于语句级复制的安全)。由于在这种模式下auto_inc锁一直要保持到语句的结束,所以这个就影响到了并发的写入性能。
innodb_autoinc_lock_mode =1
这一模式下对simpleinsert 做了优化,由于simple insert一次性插入值的个数可以立马得到确定,所以mysql可以一次生成几个连续的值,用于这个insert语句;总的来说这个对复制也是安全的(它保证了基于语句级复制的安全)。这一模式也是mysql的默认模式,这个模式的好处是auto_inc锁不要一直保持到语句的结束,只要语句得到了相应的值后就可以提前释放锁
innodb_autoinc_lock_mode =2
所有insert种类的SQL都可以立马获得锁并释放,这时的效率最高。但是会引入一个新的问题:当binlog_format为statement时,这时的复制没法保证安全,因为批量的insert,比如insert ..select..语句在这个情况下,也可以立马获取到一大批的自增id值,不必锁整个表,slave在回放这个sql时必然会产生错乱 此变量设置为默认值1,此模式下对任何模式(binlog_format= statement/row/mixed)的数据复制都是安全的 在binlog_format=row时,也可以将其设置为2。对于交错语句,insert语句不使用表级的auto-inc锁,多个语句可以同时执行,从而提高并发性能。但如果在从二进制日志重放SQL语句时使用基于 binlog_format为statement复制或恢复方案,设置为2则是不安全的 总结: innodb_autoinc_lock_mode通常情况下设置为1即可,安全性和性能平衡下来最好的。通常情况下innodb_autoinc_lock_mode设置为1的性能影响可以忽略,如果有性能问题,需要检视下业务代码逻辑是否正常;当binlog_format=row时,在有大量的bulk insert并且不care自增键的连续性时可以设置为2,可以提高写入性能
