AUTO_INCREMENT的实现方式

相关变量
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,都允许并发插入




请使用浏览器的分享功能分享到微信等