步长
-
auto_increment_increment
controls the interval between successive column values.mysql> SHOW VARIABLES LIKE 'auto_inc%';
偏移量
-
auto_increment_offset
determines the starting point for theAUTO_INCREMENT
column value. Consider the following, assuming that these statements are executed during the same session as the example given in the description forauto_increment_increment
:mysql> SHOW VARIABLES LIKE 'auto_inc%';
When the value of
auto_increment_offset
is greater than that ofauto_increment_increment
, the value ofauto_increment_offset
is ignored.
具体的偏移量算法
InnoDB
无法在执行Insert
语句之前知道确切的插入记录数,因此会使用表级的AUTO_INC
锁(该锁比较特殊,并不像通常的锁那样,在事务结束时释放,而是在该语句执行完毕后释放)。对于AUTO_INCREMENT
值,目前InnoDB
会采取预分配的策略,即首先分配1,如果用尽则double
,如果用尽再double
,即1,2,4,8...
。需要注意的是,如果innodb_autoinc_lock_mode =2
,那么InnoDB
不会使用AUTO_INC
锁。
# 插入1行
n = 1
AUTO_INCREMENT += auto_increment_increment * 1
# 插入2行
n = 2
AUTO_INCREMENT += auto_increment_increment * 2
# 插入10行
n = 16
AUTO_INCREMENT += auto_increment_increment * 8
总结
公司的数据库不连续的原因是应为集群里面的数据库的机器数量是5,导致会有很多相差为5的主键。
参考
关于mysql的自增型主键的更多其他描述,见http://whitesock.iteye.com/blog/1329857
网友评论