范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

MySQL发号问题的分析和改进

  这是学习笔记的第 2253篇文章
  读完需要
  5
  分钟   速读仅需3分钟   关于发号器的使用,其实有一个大背景,那就是关于主键的一些设计问题,在MySQL中如果一张表没有主键,实际的数据处理就有点麻烦了。   因为在InnoDB存储引擎中,表都是按照主键的顺序进行存放的,我们叫做聚簇索引表或者索引组织表(IOT)   (1)显式的创建主键Primary key。   (2)判断表中是否有非空唯一索引,如果有,则为主键。   (3)如果都不符合上述条件,则会生成UUID的一个隐式主键(6字节大)   可以使用类似的SQL来看到这个隐藏列,select _rowid from test ;   这和主键有什么关系?主要是因为有些时候我们创建主键就是为了创建而创建,没有实际的业务含义,所以会形成一种使用习惯,那就是启用自增列。   自增列的问题很多,有些几句话还说不清楚,大体有如下的一些问题   自增列没有业务含义   过度依赖自增列   自增列和状态值主键并存,反而影响业务逻辑和性能   MySQL历史遗留bug,在MySQL 8.0该问题才修复   到了这里,我们的需求也基本明确了,我们所说的发号器其实就是要确保每次取到的ID号都是唯一的,当然也显而易见是趋势递增的。   我来说一个初版的发号器实现,假设我们创建一张表test_inc,假设按照业务逻辑,自增列的初始值为1000,则建表语句为:create table test_inc(id int primary key auto_increment,flag varchar(20)) engine=innodb auto_increment=1000;alter table test_inc modify flag varchar(20) unique;   建表语句为:mysql> show create table test_incG*************************** 1. row *************************** Table: test_incCreate Table: CREATE TABLE `test_inc` ( `id` int(11) NOT AUTO_INCREMENT, `flag` varchar(20) DEFAULT , PRIMARY KEY (`id`), UNIQUE KEY `flag` (`flag`)) ENGINE=InnoDB AUTO_INCREMENT=1000 DEFAULT CHARSET=latin1   使用replace into的逻辑来进行id的初始化:replace into test_inc(flag) values("1");   数据结果为:mysql> select *from test_inc;+------+------+| id | flag |+------+------+| 1000 | 1 |+------+------+ row in set (0.00 sec)   mysql> replace into test_inc(flag) values("1");Query OK, rows affected (0.01 sec)   mysql> select *from test_inc;+------+------+| id | flag |+------+------+| 1001 | 1 |+------+------+ row in set (0.00 sec)   得到当前的写入id值为:mysql> select last_insert_id;+------------------+| last_insert_id |+------------------+| 1001 |+------------------+ row in set (0.00 sec)   按照这个逻辑在多会话并发中依然可以得到期望中的ID自增效果,这些也是last_insert_id本身的功能范围,就不再赘述了。   但是这种方案在RDS环境中会碰到一个很尴尬的问题,那就是RDS的服务会做内部切换,而切换后的ID值就会重置。   假设从库的id当前值为1002,在从库切换后,会提升为主库,即可以实现读写,那么在新主库上执行replace into语句结果就会让人奇怪,完整的模拟过程如下:mysql> select * from test_inc;+------+------+| id | flag |+------+------+| 1002 | |+------+------+ row in set (0.00 sec)   mysql> replace into test_inc(flag) values("1");Query OK, rows affected (0.02 sec)   mysql> select * from test_inc;+------+------+| id | flag |+------+------+| 1001 | |+------+------+ row in set (0.00 sec)   mysql> select last_insert_id;+------------------+| last_insert_id |+------------------+| 1001 |+------------------+ row in set (0.00 sec)   碰到这种情况就很尴尬了。好端端的自增ID一下子被打回了原形,而如果结合主从复制的过程和replace into的逻辑,其实也不难分析出这个问题。   简而言之,对于自增列的使用,在如上的场景中是不能够胜任ID自增的逻辑的,可能会产生断层,我们可以通过别的方式来实现。   在数据库中不难发现这样的设计成平,比如Oracle里面的sequence就是一个例子。   我们干脆来实现下这个sequence的简单逻辑吧。 mysql> create table sequence(id int primary key auto_increment);Query OK, 0 rows affected (0.05 sec)   mysql> insert into sequence values(last_insert_id);Query OK, row affected (0.01 sec)   接下来需要做两类场景的测试,   验证方法一样:mysql> select * from sequence;+------+| id |+------+| 1003 |+------+ row in set (0.00 sec)   mysql> update sequence set id=last_insert_id(id+);Query OK, row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0   mysql> select * from sequence;+------+| id |+------+| 1004 |+------+ row in set (0.00 sec)   mysql> select last_insert_id;+------------------+| last_insert_id |+------------------+| 1004 |+------------------+ row in set (0.00 sec)   一种是多会话状态下验证ID自增的情况,使用last_insert_id   另外一种则是在从库端直接刷新验证,通过测试可以快速验证得到这种方式的可行性。   当然这个还没有考虑复杂的并发场景,如果想提高吞吐量,可以考虑分布式ID的玩法。

这样吐槽,才是情商高的表现心情不好的时候,你会做些什么?看看书,旅旅行,或者找要好的朋友聊一聊?不管你的答案是什么,与他人倾谈都是不错的选择。跟朋友聊聊,给电台热线打个电话倾诉,发个朋友圈状态说一说,似乎这怎样说话才是真的尊重孩子?亲子沟通6大法则,父母必看!倩倩的妈妈最近觉得自己很悲催,因为倩倩总是很嫌弃自己每次妈妈走近她,她都想办法躲开妈妈跟她说话,她有时会装作没听见,有时甚至会大声地说哎呀!你别说啦!倩倩妈妈觉得自己与女儿之间出现暑假去哪?当然是来情商夏令营啦!张怡筠博士和孩子们开心大合照1情商夏令营,玩出情商力本情商夏令营由著名心理学家情商教育专家张怡筠博士,带领团队精心研发,在生动有趣的游戏活动互动环节中,轻松提升小学生的自信乐观热爱张怡筠博士亲授课38女神节限时特惠,5折价即可订阅!张怡筠博士精品专栏用情商搞定爱情女神节当天限时优惠5折价格即可订阅仅此1天,赶快点击链接试听课程吧E3808AE794A8E68385E59586E6909EE5AE9AE788B你是高情商人才吗?一个权威测试告诉你情商测试今天我们来做一个小测试。下面是一份根据巴昂情绪智力量表EQi改编的情商10项自查清单,看看你有几项符合吧。如果有810项符合你,那么你的情商水平较高,情绪稳定,乐观自信,富混得不错的人,都具备这3个高情商的特质1hr想要工作高效,创造力迸发?懂得休息才能更好地继续心理学家AndresEricsson在研究过不同领域的成功人士后发现,每工作90分钟休息5分钟,如,散散步,与同事聊聊等,能让越会吐槽,情商就越高,真的是这样吗?心情不好的时候,你会做些什么?看看书,旅旅行,或者找要好的朋友聊一聊?不管你的答案是什么,与他人倾谈都是不错的选择。跟朋友聊聊,给电台热线打个电话倾诉,发个朋友圈状态说一说,似乎这17岁少年跳桥事件反思究竟该如何与青春期孩子沟通?4月17日晚,上海卢浦大桥上发生了一件令人痛心疾首的事一名17岁的花季少年,在与母亲发生言语冲突后,纵身一跃从桥上跳下,结束了自己年轻的生命。视频中,孩子从轿车中出来,决绝地冲到桥全国100场情商讲座即将开启,快来看看有你的城市吗?后台经常收到粉丝朋友的问题张怡筠博士团队什么时候有线下讲座?张博士团队什么时候来我的城市?终于,在粉丝们热情的呼吁下我们新筹划的2019大型线下讲座情商100系列活动即将启航!1h高情商给你带来了什么?这100多人的分享,用情商点亮人生长期关注张博士的粉丝都知道张博士携其亲自培养的情商讲师们在6月份举办了情商100大型系列情商讲座覆盖全国38个城市累计讲座数量高达113场6月结束了,113场讲座也按计划全部顺利完孩子输不起怎么办?做好这3点,引导孩子树立正确输赢观轩轩妈妈问张博士,您好!我儿子轩轩和邻居小伙伴们一起玩过家家的游戏,因为不高兴自己老是当小宝宝,就抢着抱娃娃,要当爸爸。没抢过来,就坐在地上大哭。最近一段时间,轩轩如此大发脾气已经
我能爱你吗?如果,我们能在对的时间遇到彼此我能爱你吗?一些很平常的接触,遇到了很心动的你。因为工作需要互相帮忙,所以留了联系方式。随着联系的增多,我越来越的越喜欢你,可我不敢说出口,我怕因为一欠你的,只是一张车票吗(三)注请慢下来,听听音乐,听听故事,小二她要结婚了,就这么嫁人了吗?说好的要为她亲手穿上婚纱呢?说好的要牵着手一直到老呢?真的就成了空话了吗?为什么?究竟是为什么?我真的恨,我恨我自己追逐自己的梦想,永远不晚读完了清单人生,最后的结局让人既感到意外,但在整本小说的层层推进下,又是让人觉得是在情理之中。一个偏执的强迫症老婆婆,在经历了人生巨变之后,既没有选择旧爱,也没有选择新欢,而是踏上我的购物欲促使我买买买,你会不会冲动呢?前段时间收拾衣柜时清空了一批衣物,顿时觉得神清气爽。可还没到一个礼拜我就忍不住又想买买买了。不知道女人是不是天生就是购物狂?上周二的时候自己一个人在金拱门看了会儿书,后来觉得自己应焦虑这个问题,到底是父母传给孩子?还是孩子传给父母?最近看到的这样的一个问题,是父母焦虑传染给孩子呢?孩子孩子焦虑传染给父母的呢?这个问题我想了一下,之前呢,我也写过一些关于孩子分离焦虑的一篇文章,那今天咱们就详细的来聊一聊关于这个穷人家的孩子得不到快乐?非也!非也!孩子的快乐是什么?最近看到这样一个问题,就是穷人家的孩子能不能得到快乐,我看到这个问题之后表示很诧异,为什么会想到这样的问题?为什么穷人家的孩子得不到快乐呢?真正的快乐是什么呢?我幼儿园孩子在家,这些事情父母得带着孩子去做幼儿园的孩子在家可以做点啥这段疫情时间,可谓是孩子在家待的时间最长的一段时间了,截至到现在,已经有将近3个月的时间了,甚至全国大部分的地区的幼儿园仍然没有开门,而且并没有任何关于开五岁的孩子拒绝各种上课,这可愁坏了父母不愿意参加任何活动的孩子最近一个朋友跟我聊了他孩子的事情,昨天幼儿园的活动,他带着他的孩子想要参加一个活动,作为锻炼,可是,这个孩子说什么都不肯参加活动。并且呢,只要爸爸妈妈一提到两分钟可以给,但是父母的原则不能丢就是不走,该咋办?最近在网上看到比较多的关于这个问题的讨论,什么呢?就是关于孩子跟我们成人提要求这件事上面,我们可能很多家长都遇到过这样的情况,孩子在公园里玩,父母说要孩子走,但是欠你的,只是一张车票吗(尾)没有童话,那就画一个注请慢下来,听听故事,听听歌小二当我再次醒来的时候,躺在医院的病床上。父母一脸焦急的守在床边,看到我醒来,终于松了一口气。朋友听到我醒来的消息,也赶了过来。他们说我那天喝酒后就吐血职场新人第一步把工作过程向前推进一小步工作中遇到一件很无语的事情。系统出现Bug,安排组员去修复,修复好后把部署到测试服务器,联系测试组尽快测试,发布更新版本。之后有其他项目会议,在会议室一直呆到快下班,才匆匆收尾,检