萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中auto_increment用法詳解

mysql中auto_increment用法詳解

在mysql中AUTO_INCREMENT類型的屬性用於為一個表中記錄自動生成ID功能,也就是會自動自增一個ID了,如現在是1下次會自動是2了,就這麼簡單,下面來看mysql中auto_increment用法詳解吧。


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

這樣才能避免兩台服務器同時做更新時自增字段的值之間的沖突。

copyright © 萬盛學電腦網 all rights reserved