mysql 自增長 innodb_autoinc_lock_mode

在MySQL 5.1.22之前,innodb使用一個表鎖解決自增字段的一致性問題(內部是用一個計數器維護,每次自增時要加表鎖),如果一行一行的插入數據則沒有什麼問題,但是如果大量的併發插入就廢了,表鎖會引起SQL堵塞,不但影響效率,而且可能會瞬間達到max_connections而崩潰。


在 5.1.22之後,innodb使用新的方式解決自增字段一致性問題,對於可以預判行數的insert語句,innodb使用一個輕量級的互斥量。如:某一insert語句1執行前,表的AUTO_INCREMENT=1,語句1的插入行數已知爲3,innodb在語句1的實際插入操作執行前就預分配給該語句三個自增值,當有一個新的insert語句2要執行時,讀取的AUTO_INCREMENT=4,這樣雖然語句1可能還沒有執行完,語句2就可直接執行無需等待語句2。


這種方式對於可預判插入行數的插入語句有效,如:insert和replace。對於無法提前獲知插入行數的語句,如:insert...select...、replace...select...和load data則innodb還是使用表鎖。


insert語句中有時會顯示的設置自增字段的值,對於這種情況innodb還是會預分配給語句總行數的自增值而不是隻有實際使用系統自增的行。因而有可能會造成自增字段的值不連續。如:
INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');
+-----+------+
| c1  | c2   |
+-----+------+
|   1 | a    |
| 101 | b    |
|   5 | c    |
| 102 | d    |
+-----+------+


下一條語句獲取的 AUTO_INCREMENT=105,而不是103。


INSERT ... ON DUPLICATE KEY UPDATE語句與之前一種情況類似,也會造成自增字段的值不連續,而且如果使用新的自增互斥方式,對於replication應該避免使用INSERT ... ON DUPLICATE KEY UPDATE語句。


設置新自增互斥方式:通過配置選項:innodb_autoinc_lock_mode,它是專門用來在使用auto_increment的情況下調整鎖策略的,目前有三種選擇:


innodb_autoinc_lock_mode = 0 (“traditional” lock mode:全部使用表鎖)
innodb_autoinc_lock_mode = 1 (默認)(“consecutive” lock mode:可預判行數時使用新方式,不可時使用表鎖) 
innodb_autoinc_lock_mode = 2 (“interleaved” lock mode:全部使用新方式,不安全,不適合replication)


http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章