AUTO_INCREMENT的實現方式

G8bao7發表於2014-01-09
相關變數
auto_increment_offset 起始位置
auto_increment_increment 自增值

# myisam
concurrent_insert 

# innodb 
innodb_autoinc_lock_mode=0,1,2 innodb引擎有效
sql_mode = NO_AUTO_VALUE_ON_ZERO,只有NULL才能生成自增值。   預設0或NULL代表生成自增值
        mysqldump時會將0做新生成自增值處理


自增長插入分類
simple  未指定自增列的值,並且插入前已確定插入行數      
bulk    未指定自增列的值,並且插入前未確定插入行數    
mixed  插入內容一部分是自增長,一部分指定自增列的值

innodb 
    # 參考
    # innodb儲存引擎第二版 6.3.4 自增長與鎖
    # http://dev.mysql.com/doc/refman/5.5/en/innodb-auto-increment-handling.html
     innodb_autoinc_lock_mode 各種值的處理方式,預設值為1
    0: auto_inc locking,表的自增鎖定(5.1.22之前的實現方式),如果不回滾,則自增值是連續的
        同一個表中只會有1個session持有,屬於表級鎖,但在insert sql執行完後立即釋放,並不是事務完成後才釋放

    1: simple 使用互斥量(mutex)對記憶體計數器進行累加,如果表正在使用auto_inc locking方式,則需要等待釋放
        bulk   使用auto_inc locking方式
        mix    由於插入行數M是已知,直接申請M個自增值,則表的下一個自增值為當前值+M
                效率高,造成自增值不連續
    2: 所有型別的insert都採用互斥量(mutex)
        插入效能高
        對於併發bulk插入,產生自增值交錯現象。同一個sql語句插入的資料自增值不連續
        基於statement的複製方式不安全
        
    #
    server啟動時對所有含自增列的表進行自增值初始化:
    (SELECT MAX(ai_col) FROM t FOR UPDATE) +auto_increment_increment ,如果表是空的,透過auto_increment_offset初始化

myisam  
    # 理解較淺,若有錯誤,請指正
    # 參考
    # http://dev.mysql.com/doc/refman/5.5/en/concurrent-inserts.html
    預設對insert進行排隊處理
    
    concurrent_insert 
    目的:reduce contention between readers and writers for a given table
    各種值的處理方式.預設為1
    0 NEVER    禁止
    1 AUTO
    如果表中資料沒有hole(沒有進行delete操作),則允許併發插入
    2 ALWAYS 無論是否有hole,都允許併發插入




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26250550/viewspace-1068726/,如需轉載,請註明出處,否則將追究法律責任。

相關文章