现身说法:实际业务出发分析百亿数据量下的多表查询优化

640?wx_fmt=png

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化,俗话说的好,一切脱离业务的架构都是耍流氓,接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自微信群,爬楼不易,整理更不易,如果有遗漏,欢迎大家在评论区留言。

640?wx_fmt=jpeg简单引子一个例子引出主题


这里我们先举个简单的例子,来个开胃菜,然后再引出今天的访谈主题。

举例:比如我们的CzarCms系统权限系统设计中的两张表:用户表以及角色表,这两张表有关联关系。这时候如果我要取一万个用户的数据,然后用户数据又需要关联角色表来查询对应的角色名称,这时候你会怎么做呢?

按照以往我们的经验我们会对大表进行尽可能的拆分,能分表就分表。我们在取数据的时候使用下join查询即可实现。

可是,当我们的系统变得足够大的时候,假设我们的用户表有一百万的用户了,角色表也有近10万的数据,这个时候我们如果还继续使用Join进行查询的时候就会变得非常慢了!

这时候我们可以改变下思路:就是先把一万条用户数据取出来,然后取所有角色id后再去重的组合,然后用一个查询把所有的角色信息取出来,再在内存中进行相应的拼接处理。这种思路勉强能够支撑。

可是如果数据量变得越来越大,这时候我们应该如何来进行处理呢?且看下面来自百亿数据实操的经典访谈。


业务场景分析实际业务触发640?wx_fmt=png

场景介绍



这里,石头哥就以他们公司的实际情况为例来进行了相关的实例阐述:

我们的主要表,都是几亿到几十亿行,一个join不小心就可以弄死数据库,

而且每天1亿包裹在路上,产生3亿多扫描数据

数据存储最少T+1,保存完整的一个月,也就是30到60天

数据量90到180亿

这里面,最常见的就是省,市,区,网点,人员,这5个字段

很久以前,我们只有三五百万业务量的时候,大家都是join五次

后来为了省事,用了10个字段,提前把名称写进去

再后来,发现亏大了

多花了好多空间,并且join不一定是只需要名称字段

于是,进入了新时代,所有数据表都有那基本的5个字段,不许join

查询出来数据后,在内存中再关联省,市,区,网点,人员等信息

地区5万行,网点3万行,人员100万,全部提前加载到内存,加起来不到100M

我们小部门有100台服务器,绝大部分用到这些基础数据

不仅仅上百亿的扫描表,其它业务表,几乎都会带有这些字段,所以,缓存基础数据,不吃亏


640?wx_fmt=png

互动环节



1. 多大的数据量,才不能用join?

答:一般来说,从表100万以内,我们都建议内存缓存,10万以内必须用进程内缓存,没得商量,内存中进行关联即可。

2. 我们删数据只能一条条删。不允许批删除,这个怎么办?

答:你们DBA可以辞退了,这么简单的事情都不会。

大数据分析的时候,每个月几个亿数据,一条条删,删到何年何月啊,当然是整个分区干掉啦

3. 可以分享一下你们的缓存方案吗?

这个就不用了吧,我觉得很多大佬关于缓存的文章就写得非常好!

我这里只补充一些量化的数字:内存速度是Redis速度100倍,Redis缓存速度是数据库至少10倍。

10万以内数据量必须缓存在进程内,100万~1亿数据缓存在Redis,10万~100万可以上下商量,超高查询量(比如每天10亿次)时放内存。

很多文章真的写得挺好的,就是少了点经验数据支撑,读者搞不清楚什么时候该用这个,什么时候该用那个。


4. 吉吉:以下场景:假设缓存了地区,比如查询人员档案信息列表是1万行  以前是关联查询  现在缓存地区不能关联查询  只能查出一万条然后循环拼接地区显示  ,因为一万行显示本身这场景就不可能,所以增加翻页 一页显示20行  完全不会性能问题  这样做对吗 求教?

答:是的,查询一页20行,理论上要去匹配20次地区,但是地区数据少,省市区才四五千行,省市区加上乡镇街道也不过5万行,可以全量缓存到内存。


吉吉:明白  谢谢  只是举例  这种思路真的很正确   我们总是从技术考虑全部场景却不考虑产品本身根本不能一劳永逸的搞。


5. 真是太牛逼了!感谢分享

答:这么Low的办法,大家都可以想得到,只是可能缺少一个遇到这个数据量的机会罢了,这是咱们.net的际遇,遇到问题可以见招拆招.


6. 你说的缓存到进程内,那多个进程内数据怎么保持一致?

答:不保持一致,因为进程级缓存,可以定时更新的,我们方案是默认10秒异步更新缓存,然后也可以按照添删改随时更新。


7. 我的内存数据以哪个为准?如果我机器是负载均衡,那么几个副本内存不一样啊!

答:以本机为准,没关系,每台服务器上都有一份缓存。缓存10万用户信息,一共也就10M左右内存,你还在意?

8. 数据怎么进行存储呢?

答:内存字典进行存储,最常用的就是并行字典 ConcurrentDictionary。


9. 假设你说的人员数据,那就必然存在 某一时刻 A进程10000人,B进程10002人,可能十秒可能八秒,但你们体量这么大,这个问题不需要处理吗

答:没错,的确存在这样的问题,我们公司有100万人员,但是全公司都知道,新加一个帐号,往往要两三天才能在100多个内部系统全部生效,甚至新签约一家网点,也要两三天以后,各个系统才会认它,等你有那个体量的时候,就可以接受更长的不一致时间,我们在淘宝开店,发布商品,有时候发布成功了,跳转到详情页却是看不到的,等几秒就好了。

另外,

我再说一句恶心一点的情况,大家别拍砖啊,在百亿级数据量之下,就算我算错个几百几千,那又怎么样???又怎么样??

对内,我会严格要求部门人员,务必追求准确;

对外,我会反复提醒部门人员,我们提供的数据精度,最高99.99%,你要敢浪费大量时间在0.01%上,我就敢给你绩效C

不用太死板嘛,把整体工作搞定,让系统稳定工作,那才是咱们的主要工作

用户有万分之一的机会看到不正确的数据,只要再刷新一次能够正确,就一定不是bug

万分之一看到不正确的数据,并且只是万分之一的偏差而已

由此换取的好处是,我们再也不用担心各种该死的“数据一致性。



TOP

1

总结

END


今天非常感谢石头哥的精彩分享,相信只有实际的业务操作经验才会有如此深刻的讲解!一切从实际业务出发,脱离理论,实践出真知。还是印证了那句话,一切脱离实际业务的架构都是耍流氓!感谢大家的阅读。


有想进一步了解石头哥的可以这篇文章《[论一个程序员的自我修养-从一张图片说起](https://www.cnblogs.com/yilezhu/p/10249547.html)》 


最后为石头哥的XCode打个广告:


NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode。

xcode在2018年已经完成对大数据场景的特殊优化改造,2019年的目标是是针对分布式数据场景的优化。

最近石头哥也在为XCode编写系列教程:

整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含多年开发经验于其中,代表作有百亿级大数据实时计算项目。


开源地址:[https://github.com/NewLifeX/X ](https://github.com/NewLifeX/X)(求star, 670+)



640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意: 场景中包括多个长度和高度各不相同的平台。地面是最低的平台,高度为零,长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落,它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…

[HDU 6643] Ridiculous Netizens(点分治+根号分治+dp)

HDU 6643 Ridiculous Netizens problem hdu6643 题目大意:给定一棵无根树,以及每个点的点权 wiw_iwi​。 定义一个连通块的价值为连通块内点的点权之积。 求有多少个连通块价值 ≤m\le m≤m。 n≤2e3,m≤1e6n\le 2e3,m\le 1e6n≤2e3,m≤1e6。 solu…

SP422 TRANSP2 - Transposing is Even More Fun(Burnside引理,莫比乌斯反演)

解析 很巧妙的题。 关键是要利用好边长为2的整数次幂的性质。 对下标从1开始党极不友好。 首先显然答案就是 2ab2^{ab}2ab -环。 让下标均从0开始。 对于一个点 (i,j)(i,j)(i,j),它原来的内存地址为 i∗2aji*2^aji∗2aj,转置后的地址为 j∗2bij*2^bij∗…

Fireworks(2020 ICPC南京)

Fireworks 题意: 你每做一个烟花要n分钟,释放已做好的所有烟花需要m分钟,每只烟花成功释放的概率为p。问你在采取最优策略的前提下,直到成功释放第一个烟花时最小的期望时间花费。 题解: 最佳策略是:每…

ASP.NET Core 沉思录 - ServiceProvider 的二度出生

ASP.NET Core 终于将几乎所有的对象创建工作都和依赖注入框架集成了起来。并对大部分的日常工作进行了抽象。使得整个框架扩展更加方便。各个部分的集成也更加容易。今天我们要思考的部分仍然是从一段每一个工程中都大同小异的代码开始的。IWebHostBuilder CreateWebHostBuilde…

[SPOJ - FTOUR2] Free tour II(点分治 + 背包dp + 启发式合并)

SPOJ - FTOUR2 Free tour II problem 给定一棵树,以及 mmm 个拥挤城市编号,选择一条最多包含 kkk 个拥挤城市的简单路径。 每条边有一个有趣度 www,可正可负。简单路径的价值定义为包含边的有趣度之和。 求最大价值。n≤2e5,∣w∣≤1e4n\…

PKUSC2022 游记

前言 1001822698014095235。 题的难度感觉比去年难不少,主要的体现在于两天的T1都没有之前那么可做了,在信息差的影响下几乎成了两场崩盘场。 由于比赛时间变短的原因,模拟反而比历年简单不少。 遗憾: d1t3的网络流莫名其妙无法…

Acwing 216. Rainbow的信号

Acwing 216. Rainbow的信号 题意: 给你n个数,在这n个数中,等概率地选取两个数l,r,如果l>r,则交换l,r 把信号中的第 l 个数到第 r 个数取出来,构成一个数列 P。 A 部分对话的密码是数列 P 的 xor 和的…

微软开源故事 | 开启 .NET 开源革命

如今,在微软构建开源软件是很正常的一件事——但早在2007年,我开始在微软工作时,情况并非如此。我们花了几年的时间才找到正确的方法,顺利开启了微软的开源之路。但是,如今我们已取得胜利,可以面带微笑地回…

【无码专区9】序列统计(带权并查集 + 前缀和建边 + dp)

因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dls的实现不太一样。 std可能…

Acwing 217. 绿豆蛙的归宿

Acwing 217. 绿豆蛙的归宿 题意: 给出一个有向无环的连通图,起点为 1,终点为 N,每条边都有一个长度。 数据保证从起点出发能够到达图中所有的点,图中所有的点也都能够到达终点。 绿豆蛙从起点出发,走向…

LNOI2022:游记

前言 The world is cruel. 真的为身边的一些人感到可惜… Day -1 PKUSC刚刚考完,然后就要省选了? 板子实在是看的够够的了。 然而还是不想深度做题,看了看APIO的practise,T1写完发现偶数还得特别做,就感觉很麻烦&…

合肥.NET技术社区首次线下聚会全程回顾【多图】

2019年3月16日对于合肥.NET来说是一个特别的日子,因为这是合肥.NET技术社区首次非正式线下聚会!这次聚会受场地限制(毕竟是聚餐的形式),即使换成了小椅子后,最多也只能容纳24个人,所以还有一些小…

【无码专区10】第K大查询(双向链表 /主席树+st表)

已自我实现,但还是归入无码专区序列。哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考。 problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l1≥kr-l1\ge kr−l1≥k 的区间 [l,r][l,r][l,r] 中的第 kkk 大…

SignalR第一节-在5分钟内完成通信连接和消息发送

前言首先声明,这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的我项目中使用的是自己搭建的 WebSocket ,连接管理和消…

P5327 [ZJOI2019]语言(线段树合并、生成树)

解析 只会扫描线树剖的三只log(悲 考虑对每个 uuu 考虑合法的 vvv 的集合,必然是一个联通块。 进一步的,观察到这个联通块就是由所有经过 uuu 的路径的端点形成的最小生成树。 我们有一个最小生成树的经典结论:最小生成树边权和…

【学习笔记】信息学竞赛中的概率与期望小结

信息竞赛——概率与期望事件事件的蕴含、包含事件的互斥事件的对立事件的和(并)事件的积(交)事件的差概率事件的独立性全概率公式贝叶斯公式概率DP(竞赛中的考察)期望(竞赛中的考察)…

Acwing 218. 扑克牌

Acwing 218. 扑克牌 题意: 一副扑克牌(54张),问得到A 张黑桃、B 张红桃、C 张梅花、D 张方块需要翻开的牌的张数的期望值 E 是多少? 如果翻开的牌是大王或者小王,Admin 将会把它作为某种花色的牌放入对应堆中,使得放…

尝试:Script Lab,快速 O365 开发工具//SL01)

《前言》Script Lab 我希望有一个系列(连载),可是我挺担心没偿没有能力去驾驭它。虽然早年前己经接触过,但一直未有下决心开始 Office 365 的开发之旅,虽然一直被光标老师所鼓舞,但是我心有旁骛还没有真正做…

P3710 方方方的数据结构(kd-tree)

解析 写吐了… 一开始觉得线段树分治直接做就行简直是个伞兵题,写完挂掉才想起来线段树分治会打乱操作顺序导致全假… 重构吧! 炸裂之下去贺题解,std做法 O(mmlog⁡m)O(m\sqrt m\log m)O(mm​logm) 令人谔谔,但kd-tree做法确实挺…