自增锁
自增锁,在提交前释放,并发插入高
s,x等锁,在COMMIT扣释放,并发插入需要等待
不能回滚到前面的值
insert -like:
simple-insert:插入前就能确定插入行数语句 bulk insert :插入前不确定插入行数的语句 replace ... select mixed-mode inserts:insert into t1(c1,c2) values(1,"a"),(null,"b"),(4,"c"),(null,"d") insert ... on duplicate key update:自身扩展 (任何KEY 重复,就执行 )
innodb_autoinc_lock_mode:
0:传统方式 , simple insert:传统方式 bulk insert :传统方式 对于 INSERT ... SELECT ... 些时其他事务不能插,分配的ID是连续得 ,其他事务不能插入 SQL执行完才释放自增锁 1. simple insert 并发 bulk insert 传统方式 2. 所有自增都以并发方式 同一SQL语句自增可能不连接 row-based binlog
工作模式1:
工作原理: BULK INSERT: ACQUIRE AI INSERT ..SELECT :如果执行时间长,自增锁持有时间就长,不确定插入的记录数,只能等插入完 才自增,其他事务等待插入 AI=AI+N RELEASE AI SIMPLE INSERT : 无SQL 语句执行等待 ACQURE AI AI=AI+N RELESE AI
工作模式为 2时的工作原理:
FOR I=AI;I++; //对BULK INSERT 也能并发插入,对单线插入变差,无益,对多线程插入是益的,自增值可能不连续的 { ACQUIRE AI LOCK INSERT ONE REC AI=Ai+1 RELEAS AI LOCK }
自增列的创建:
对于联合索引,自增列必须放在第一个列 create table jjj ( a int auto_increment,b int ,key( a,b)); // KEY(b,a)
自增锁:
AUTO_INCREMENT PK 不能持久化,速度快
当重起MYSQL 服务器重新计算值:
SELECT MAX(AUTO_INC_COL) FROM XX 基于索引查找,而不是全表扫
自增锁相关参数:
auto_increment_increment:步长值
auto_increment_offset:初始值
每个节点产生全局唯一自增值设置
auto_increment_offset =1 auto_increment_offset=2
auto_increment_increment=10 auto_increment_increment=10