重要为了提升插入数据的效率和并行度。
假设有两个并行实行的事务,在申请自增值的时候,为了制止两个事务申请到雷同的自增 id,肯定要加锁,然后顺序申请。
假设事务 A 申请到了 id=2, 事务 B 申请到 id=3,那么这时候表 t 的自增值是 4,之后继续实行。
事务 B 正确提交了,但事务 A 出现了唯一键辩说。
如果允许事务 A 把自增 id 回退,也就是把表 t 的当前自增值改回 2,那么就会出现这样的情况:表内里已经有 id=3 的行,而当前的自增 id 值是 2。
接下来,继续实行的其他事务就会申请到 id=2,然后再申请到 id=3。这时,就会出现插入语句报错“主键辩说”。
而为了解决这个主键辩说,有两种方法:
每次申请 id 之前,先判断表内里是否已经存在这个 id。如果存在,就跳过这个 id。但是,这个方法的成本很高。因为,本来申请 id 是一个很快的操作,现在还要再去主键索引树上判断 id 是否存在。
把自增 id 的锁范围扩大,必须比及一个事务实行完成并提交,下一个事务才能再申请自增 id。这个方法的题目,就是锁的粒度太大,系统并发能力大大降落。
可见,这两个方法都会导致性能题目。
因此,InnoDB 放弃了“允许自增 id 回退”这个设计,语句实行失败也不回退自增 id。
utf8 、utf8mb3和 utf8mb4的区别
utf8mb3:只支持最长三个字节的BMP(Basic Multilingual Plane,基本多文种平面)字符(不支持补充字符)。 utf8mb4:mb4即 most bytes 4,即最多使用4个字节来表现完整的UTF-8,具有以下特征: