美文网首页
sql自学笔记(二十三)——MySQL8.0版本的新特性(十三)

sql自学笔记(二十三)——MySQL8.0版本的新特性(十三)

作者: itczt | 来源:发表于2019-05-11 17:43 被阅读0次

    自增列持久化

    • MySQL5.7以及早期版本中,InnoDB自增列计数器(AUTO _ INCREMENT)的值只存在内存中。
    • MySQL8.0每次变化时将自增计数器的最大值写入redo log,同时在每次检查点将其写入引擎私有的系统表。
    • 解决了长期以来的自增字段值可能重复的bug。

    我们可以重现一下自增列中存在的bug

    创建一个测试表

    create table t(id int aute - increment primary key,c1 varchar (10));
    //他有一个id列,是自增的数字,设为主键,有创建c1为字符
    

    生成一些记录,3条a,b,c

    insert into t(c1) values('a'),('b'),(’c‘);
    

    我们来查询这张表

    select * from t;
    

    我们再来删除一条记录

    delete from t where id=3;
    select * from t;
    

    这个时候我们重启一下



    我们在来生成一条记录

    insert into t(c1) values('d');
    select * from t;
    

    这里我们可以看到这个自增列已增长到3,实际上它的id
    值应该是4,它有一个重复的id

    我们把c1=’a‘的id改成5

    update t set id=5 where c1 = 'a';
    select * from t;
    

    这个时候再插入一条记录

    insert into t(c1) values('e');
    select * from t;
    

    我们可以看到id为4,他是基于3接着往上增长的。
    如果我们还插入一条记录

    insert into t(c1) values('e');
    

    如图所示,它就出现了主键重复的一个问题

    对于8.0当中是如何解决这个问题的

    与上面相同同样创建一个测试表



    先删除一条记录

    delect from t where id = 3;
    select * from t;
    

    同样退出重启一下
    插入一条新的记录

    insert into t(c1) values('d');
    seolect * from t;
    

    我们可以看到“d”的id不是3而是4,也就是说不会使用以前用过的id,即使把以前的值删掉,或在事务当中使用事务的id进行了事务的回管,他会认为你已经使用过计数器的值,而不会在生成重复的值。
    同样:

    update t set id=5 where c1 = 'a';
    select * from t;
    
    insert into t(c1) values('e')
    select * from t;
    

    我们看到它没有出错,而是生成了6,它感知了我们表中对id的修改。

    相关参数的变化

    show jvariables like 'innodb _ autoinc%';
    

    对于8.0而言它的默认值是2
    在5.7当中他的默认值为1.



    在8.0当中这个2它代表的是交叉模式,也就是说它这个锁是交叉生成的。
    1代表的是连续模式,他的差别在于复制时,可以保证语句级别的id生成自动增长的列时连续的.

    相关文章

      网友评论

          本文标题:sql自学笔记(二十三)——MySQL8.0版本的新特性(十三)

          本文链接:https://www.haomeiwen.com/subject/ijnxaqtx.html