auto increment
mysql的自增步長可以通過下面的命令查詢,
mysql> SHOW VARIABLES LIKE 'auto_inc%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
+--------------------------+-------+
其中,auto_increment_increment是自增的步長,value為1代表每次+1,auto_increment_offset是自增的偏移量,也就是自增開始,value為1代表從1開始增加。
InnoDB自增主鍵是通過本身的自增計數器獲取,該方式會通過表鎖機制完成。
表鎖只有在插入結束後才釋放,也就是事務完成後。
為了解決自增主鍵鎖表的問題,引入了innodb_autoinc_lock_mode,通過輕量級互斥量的增長機制來完成。
mysql> show variables like 'innodb_autoinc_lock_mode';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_autoinc_lock_mode | 1 |
+--------------------------+-------+
innodb_autoinc_lock_mode的取值有三種:
0,表鎖
1,默認值,互斥量,會“預申請”多余的值,可能會出現不連續的情況
2,自增值不連續,性能好
參數innodb_autoinc_lock_mode = 1時,每次會預申請多余的id(handler.cc:compute_next_insert_id),而insert執行完成後,會特別將這些預留的id空出,就是特意將預申請後的當前最大id回寫到表中
最近就發現一次一個數據表由於頻繁的insert on duplicate key update導致了表的不連續,具體原因是該數據會預分配id但如果插入失敗執行更新操作,那麼該id就被廢棄了,而下一條插入操作會跳過該值。
應用
在mysql主主同步時(兩台機器互相同步數據),需要設置
auto_increment_increment = 2
auto_increment_offset = 1 和 2
這樣才能避免兩台服務器同時做更新時自增字段的值之間的沖突。