mysql 自增值申请策略

自增值申请策略

  1. 能否先查ID,再查入数据?

    不能,如果每次插入前,都要在主键的索引树上查询要插入的id是否存在,会大大降低插入插入的效率。

  2. 能否等事务完成后,再释放自增值的锁?

    不能,如果需要等待当前事务完成,其它事务先能获取自增值的锁,就会大大降低并发。

innodb_autoinc_lock_mode

MySQL通过参数innodb_autoinc_lock_mode,来设置自值锁的行为,默认值为1

  1. 0值 :等事务完成才释放锁

  2. 1值 :

    • 对于普通的insert into table,申请到自增锁后就释放,不用等插入语句的完成。
    • 对于批量插入,类似insert ... select,一直持有自增锁,直到事务执行完成。这样也保证了id的连续性。
  3. 2值:所有插入操作在申请到自增锁后就释放,包括insert ... select 这种