MySQL innodb_autoinc_lock_mode設置

https://www.jianshu.com/p/f72b7bfa7467

https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html
國內的文章看得真是蛋疼,跟官網的文檔意思差別太大。

insert 語句分類

insert 語句分三種類型:simple insert, bulk insert, mixed insert

  • simple insert
    insert 時可以預先知道插入的行記錄數量。例如insert into t values(a), (b), 這個語句插入時,mysql就可以預先知道插入的行記錄數量爲2.
    insert ... on duplicate...語句不屬於simple insert

  • bulk insert
    insert 時可以預先知道插入的行記錄數量。
    例如load data語句、INSERT ... SELECT語句, REPLACE ... SELECT語句都屬於bulk insert。

  • mixed insert
    simple insert中有一部分指定了AUTO_INCREMENT的值。這個官方文檔說得不明白。看得也不是很明白。

innodb_autoinc_lock_mode

innodb_autoinc_lock_mode有三個值:

  • 0, traditional
  • 1, consecutive
  • 2, interleaved

traditional

這種模式下,所有的insert語句在開始時都會獲得一個表鎖autoinc_lock.該鎖會一直持有到insert語句執行結束纔會被釋放。對於一條insert插入多個行記錄的語句,他保證了同一條語句插入的行記錄的自增ID是連續的。
這個鎖並不是事務級別的鎖。
在這種模式下,主從複製時,基於語句複製模式下,主和從的同一張表的同一個行記錄的自增ID是一樣的。但是同樣基於語句複製模式下,interleaved模式,也就是innodb_autoinc_lock_mode=2時則不能保證主從同一張表的同一個行記錄的自增ID一樣。
這種模式下,表的併發性最低。

consecutive

這種模式下,insert語句在開始時會獲得一個表鎖autoinc_lock, simple insert在獲取到需要增加的ID的量後,autoinc_lock就會被釋放,不必等到語句執行結束。但對於bulk insert,自增鎖會被一直持有直到語句執行結束纔會被釋放。
這種模式仍然保證了同一條語句插入的行記錄的自增ID是連續的。
這種模式下的主從複製表現跟traditional模式下一樣,但是性能會有所提高。

interleaved

這種模式下,simple insert語句能保證ID是連續的,但是bulk insert的ID則可能有空洞。
主從複製的同一張表下的同一行id有可能不一樣。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章