一再查询与涉及查询讲解

 

A,B五个表数据规模十几万,数据规模都不大,单机MySQL够用了,在单机的根底上要提到两表的数额,先说一个最好气象,A,B七个表都未曾索引,并且关系是笛Carl积,这关联结果会爆炸式增长,可能到亿级别,那么些时候网络IO成了瓶颈,这多少个时候三遍十万行结果集的拉去或许远小于1次亿级其余结果集的拉取,那么将涉及合并拉到service层做更快。但骨子里业务中一般不会有如此蠢的行事,一般涉及会有连日条件,并且连接条件上会有目录,一般是有一个结实集相比较小,得到这么些结果集去另一张表去关联出其余信息,假如放置service层去做,最快的办法是,先查A表,得到一个小的结果集,三遍rpc,再遵照结果集,拼凑出B表的询问条件,去B表查到一个结实集,再四回rpc,再把结果集拉回service层,再几遍rpc,然后service层做联合,3次rpc,倘诺用数据库的join,关联结果拉回来,两回rpc,帮您省了一回rpc,当然数据库上做涉嫌更快,对应到数据库就是一遍blk
nested loop join,这是工作常用情状。
只是真的大多数业务都会考虑把这种联合操作放到service层,我认为有几下面考虑:
第一:单机数据库总括资源很贵,数据库同时要服务写和读,都需要耗费CPU,为了能让数据库的吞吐变得更高,而事情又无视那几百神秘到阿秒级的延时差距,业务会把更多划算放到service层做,毕竟统计资源很好水平扩展,数据库很难啊,所以大部分政工会把纯统计操作放到service层做,而将数据库当成一种带事务能力的kv系统来接纳,那是一种重业务,轻DB的架构思路
其次:很多复杂的事情或者会由于发展的野史由来,一般不会只用一种数据库,一般会在多少个数据库上加一层中间件,四个数据库之间仍可以做毛的join,自然业务会抽象出一个service层,降低对数据库的耦合。
其三:对于有些特大型商厦出于数量规模宏大,不得不对数据库进行分库分表,这一个题材自己在《阿里干吗要禁用三表以上的join》上也回答过,对于分库分表的接纳,使用join也备受了广大限制,除非业务可以很好的遵照sharding
key明确要join的六个表在同一个物理库中。而中间件一般对跨库join都协助不佳。举一个很广泛的作业例子,在分库分表中,要一并更新五个表,那五个表位于不同的物理库中,为了保证数据一致性,一种做法是透过分布式事务中间件将四个改进操作放到一个作业中,但诸如此类的操作一般要加全局锁,性能很捉急,而有点工作能够忍受短暂的数量不一样,如何是好?让它们分别更新呗,可是会设有数据写失败的题材,这就起个定时任务,扫描下A表有没有挫折的行,然后看看B表是不是也没写成功,然后对这两条提到记录做订正,这个时候同样没法用join去实现,只可以将数据拉到service层应用自己来归并了。。。

 

 

作者:聿明leslie
链接:https://www.zhihu.com/question/68258877/answer/264097272

发表评论

电子邮件地址不会被公开。 必填项已用*标注