b、当该值为1的时候,普通的insert语句,自增锁在申请之后马上释放,insert into select语句,自增锁还是要等语句结束之后才释放
c、该值为2的时候,所有的申请自增主键的动作都是申请完成之后就释放锁
之所以对insert into select语句单独处理,是因为这种语句"预先不知道要申请多少个id",如果我们要select的表有10w行记录,那么要做10w次的申请自增id的动作。MySQL认为这是欠妥当的,因此,对这种批量insert语句,包括load data等,它在内部做了一个自增值生成策略的优化:
1、批量执行的insert语句,第一次申请1个自增id
2、一个id用完了,第二次申请2个自增id
3、2个id用完了,第三次申请4个自增id
例如,我们看下面这个例子:
mysql> truncate table t;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t values(null, 1,1);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t values(null, 2,2);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t values(null, 3,3);
Query OK, 1 row affected (0.00 sec)
mysql> insert into t values(null, 4,4);
Query OK, 1 row affected (0.00 sec)
mysql> create table t2 like t;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into t2(c,d) select c,d from t;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> insert into t2 values(null, 5,5);
Query OK, 1 row affected (0.01 sec)
mysql> select * from t2;
+----+------+------+
| id | c | d |
+----+------+------+
| 1 | 1 | 1 |
| 2 | 2 | 2 |
| 3 | 3 | 3 |
| 4 | 4 | 4 |
| 8 | 5 | 5 |