一个MySQL建表需求的讨论和引导
昨天收到一个业务同学的需求邮件,一般有些复杂的需求业务同学会发邮件告知我们,需要我们评估之后再做交付,我看了邮件之后,发现这个需求好像有点别扭,大体的意思是在中间件的环境中创建一张表,表结构如下:CREATE TABLE `app_loading_info` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT "自增ID", `pid` bigint(20) NOT NULL DEFAULT "0" COMMENT , `appid` int(11) NOT NULL DEFAULT "0" COMMENT "APPID", `username` varchar(64) NOT NULL DEFAULT "" COMMENT "姓名", `card` varchar(20) NOT NULL DEFAULT "" , `ai` varchar(40) NOT NULL DEFAULT "" , `state` int(11) NOT NULL DEFAULT "0" , `ctime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间", `mtime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间", PRIMARY KEY (`id`), KEY `idx_pid` (`pid`), KEY `idx_state` (`state`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
按照ID分片,基本逻辑如下:
每天会去筛选为完成处理的用户数据,重新处理,处理完成后会去修改用户的一个标志位,主要有几个步骤:
1)根据state状态提取state=0的数据(未完成处理数据)
2)程序中按照id为区间分批提取
3)提取完成后修改state为state=1,根据pid,state组合
看了这个初步的设计之后,我总是感觉哪里不对,于是找业务同学面对面沟通。
首先对于这个表的定义上,业务同学说是归属于状态表,也就意味着表中的每一个用户都有唯一的状态值对应,这个表中存储的数据量会越来越大。
其次,按照state状态字段去提取未完成处理的数据,这个目标环境是一套集群环境,集群中是按照id进行分片,但是查询条件按照state是有潜在问题的。
比如业务层对于自增id的使用,在分片环境中可能是不唯一的,如上图所示,可能id=1最多会存在N条同样的数据(N为分片数),所以从业务需求上是不太能满足的。
另外根据state=0去查询数据,这个查询的复杂度较高,也就意味着state=0需要遍历所有的分片,每个分片中会通过state=0的索引条件过滤数据最后汇总起来,从使用上来说,这也是分库分表的一个潜在影响,不是很建议这种使用方式。
还有字段id的设计,按照状态表的使用方式,也是不合理的,在一些特殊的场景中我们会采用id+其他业务属性字段组合主键, 在这里这种场景显然不是。
如果去掉id字段采用主键的模式,好像就违背了业务初衷根据id进行区间提取的方式,细细品来这个需求是矛盾的。
如果按照最勉强的方式,建议是指定时间范围内处理,比如8点到9点之间处理,这个之外的时间范围就不要做类似心跳或者服务检测的处理了,对于业务侧来说,还是能够基本接受的,但是无论如何这不是一种最优解,而且对于索引的使用实在有悖于中间件服务使用的初衷。
经过进一步的沟通,我们再次挖掘需求,对于里面的表数据是如何处理的,业务同学说其实表中的数据如果时间长了之后是需要考虑数据清理的,所以按照这种模式,这个需求的就基本清晰了,和初始需求有比较大的差异。
到了这里需求的方向其实就有了大的转折,这个表按照目前的需求其实使用日志表的模式要更好一些,比如表中的数据是按照如下的列表情况存储,以日期表为维度进行存储。
如果需要按照T+1的模式去处理未完成的数据,整个复杂度只针对某一天的表执行索引扫描,不会对其他的表产生关联影响,而如果按照日期为单表存储,整个事情的自由度就更大了,按照state或者是pid的维度进行查询,效果都是可以接受的。
所以最后经过讨论和评估,其实没有必要在中间件环境中进行该类业务的处理,相比而言,性价比也不高。而基于中间件的服务承接的是偏核心的业务,对于性能和负载的影响较为敏感,如果稀里糊涂就执行了,其实后面会带来一些其他的隐患。
通过这样一个看起来简单的需求的沟通和挖掘,最后产生了不同的解决方案,对于业务侧来说还是比较满意的,至少能够超出他们的基本需求期望实现,而且很多细节的工作也不需要更多的人工参与和后期讨论,大大减少了沟通的边际成本。
以上仅是一个需求的讨论过程,不代表方案是最优的,仅供参考。
点在看,让更多人看到
孩子的天赋在哪里铁的规律发现孩子的天赋书稿发布(7)1在孩子身上这是毫无疑问的铁律。天赋作为孩子特有的先天或者说基因条件所赋于的内在特质,存在于每一个孩子身上。每个人都具有一些自己独有的天赋潜能,每个人都
儿子在幼儿园发生的事情,我这么做的,大家说说这样处理对不对?昨天下午,妻子忽然微信上跟我讲了一件事老师刚才告诉她,幼儿园里一个小女孩无缘无故的揪了儿子的耳朵,老师发现后及时进行了制止,并且对两人分别进行了询问,了解事情发生的前因后果。得知儿
生个二胎,我就成罪人了?生个二胎,我就成罪人了?我家大宝是女儿,8岁的时候,二胎政策开放,我家生个二胎儿子,儿女双全,我娘家都是蛮高兴的,我姐是儿女双全,我妹也是,我家又是,我老妈嘚瑟的不行,走路都是飘的
什么是父母爱是个动词母亲是婴儿第一个接触的人,也是第一个依赖的人,只有婴儿和母亲建立起联系,婴儿才会在往后的成长里与社会建立联系。母亲只有真正关爱孩子才会拥有母亲的技能,这种技能是指与孩子的
迟到二十多年的父母爱1990年,冬月的第一天,蒋云香呱呱落地。一落地,她安安静静地,不哭不闹。颇有经验的接生婆,倒不慌,不紧不慢地用手指弹着她的右脚心,可打了几下也没动静,接生婆才有些着急了。右脚不行
天堂的爸妈医生问道,家属是保大还是保小孩子妈妈说保小孩子爸爸说保大孩子妈妈说如果我死了你会不会找其他女孩子孩子爸爸说如果你敢死,我就敢找孩子妈妈说那我不死了孩子爸爸说真乖,这才是我的好媳妇说
不想回忆的20212021即将挂上句号了,回顾这一年,留有太多的心酸和委屈,太多的不顺和无助,这都是他人不曾体会的。2021年从最初的一个人到两个人,身经怀孕的苦,忍受生育打针的痛,这一年把二十多年
按月份给虎宝宝起名字一月琳熙瑾蓝端月绮菲林染屿瑞枫翊峻轻沐巍书玮二月祎若芷衿楠瑄璐槿芸瑶景铄琪琛霄若云峥炫琰三月栀梦沐玥岚兮悦晨桐月月铭津遥初瑜展弘苑璋四月鸢时孟夏朦胧如婳忻瑗禹恺昱珩思绦皓璟皓予五月
孕期体重管理孕期孕妈们做了体重管理吗?下面我把一些经验分享给孕妈们,做一个参考。我是2020年1月中旬发现怀孕的,去医院做了相关检查,到社区建档案,我看了有关怀孕的书,和咨询了医生,制定一个孕
一个人怎么度过孕期?老公不在身边,一个人度过孕期,心态最重要!从某种程度上来说,我认为孕期保持一个乐观开朗的心态比保证饮食营养更重要!首先,来说说孕期心态不好弊端1心态不好会导致食欲不振,肠胃吸收不好
怀孕后,胎儿最怕的不是手机,而是孕妈常遇到的这几种致畸源辐射会导致胎儿畸形大多数孕妈,特别是第一次怀孕的孕妈,听之特别紧张。那辐射源到底来自哪些呢?我是一位二胎宝妈,所以在宝妈群里呆得比较久,我经常看到宝妈们一致认为,辐射源是来自以下的