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

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…

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

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

Acwing 216. Rainbow的信号

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

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

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

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

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

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

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

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

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

Keiichi Tsuchiya the Drift King

Keiichi Tsuchiya the Drift King 题意: 给定一辆小车长宽分别为 b,a,轨道的圆弧部分半径为 r,圆弧对应的角度为 d,求出小车能通过轨道的最小轨道宽度 w。 题解: 我们考虑小车处于什么状态会使弯道最宽…

AspNet Core 下利用普罗米修斯+Grafana构建Metrics和服务器性能的监控

概述Prometheus是一套开源的监控&报警&时间序列数据库的组合,起始是由SoundCloud公司开发的。该项目有非常活跃的社区和开发人员,目前是独立的开源项目,现在最常见的Kubernetes容器管理系统中,通常也会搭配Prometheus进行监控。prome…

软件工程真的是一门什么用都没有的学科么?

软件工程真的是一门什么用都没有的学科么?-----读《构建之法》有感楔子我很惭愧,构建之法这本书已经出版四五年了,我之前却未曾涉猎,还是在通过组织长沙.net技术社区之后,才因为因缘际遇有幸认识邹欣邹老师之后&#x…

Ball Dropping

Ball Dropping 题意&#xff1a; 求&#xff1f;的具体长度 题解&#xff1a; 算一算就出来了 代码&#xff1a; #include<bits/stdc.h> using namespace std; int main(){double r,a,b,h;cin>>r>>a>>b>>h;if(2*r<b&&2*r<…

尝试:Script Lab,开发模式之知识储备//SL02

前期00&#xff1a;深度&#xff1a;从 Office 365 新图标来看微软背后的设计新理念前期01&#xff1a;尝试&#xff1a;Script Lab&#xff0c;快速 Office 365 开发工具 //SL01本期02&#xff1a;尝试&#xff1a;Script Lab&#xff0c;开发模式之知识储备 //SL02项目特点适…

WebApi网关之Bumblebee和Ocelot性能对比

Bumblebee是基于.net core 2.1开发的WebApi网关组件&#xff0c;由于Bumblebee所追求的轻量化和性能&#xff0c;所以它并没有像Ocelot那样从asp.net core上进行扩展&#xff1b;而是构建在BeetleX.FastHttpApi之上&#xff0c;主要原因BeetleX.FastHttpApi有着更轻量化和高性能…

在 .NET Core 中运行 JavaScript

一.前言在 .NET Framework 时&#xff0c;我们可以通过V8.NET等组件来运行 JavaScript&#xff0c;不过目前我看了好几个开源组件包括V8.NET都还不支持 .NET Core &#xff0c;我们如何在 .NET Core 中运行 JavaScript 呢&#xff0c;答案是使用 NodeServices。关于为何有在 .N…

Named Volume 在 MySQL 数据持久化上的基本应用

原文作者&#xff1a;春哥非常感谢春哥的投稿&#xff0c;同时也有一些感慨。初识春哥时&#xff0c;春哥是美术设计大咖。后不久&#xff0c;创业并致力于游戏开发&#xff0c;已有3年。从Unity3D到IOS&#xff08;Swift&#xff09;开发&#xff0c;从前端开发到后端以及容器…

.Netcore 2.0 Ocelot Api网关教程(7)- 限流

本文介绍Ocelot中的限流&#xff0c;限流允许Api网关控制一段时间内特定api的总访问次数。限流的使用非常简单&#xff0c;只需要添加配置即可。1、添加限流修改 configuration.json 配置文件&#xff0c;对 UpstreamPathTemplate 为 /webapib/values 的配置修改如下&#xff1…

微信开发必看,使用.Net Core 开发微信跨平台应用

.NET Core 是一个开源通用的开发框架&#xff0c;源码由微软官方和社区共同支持。支持跨平台&#xff0c;即支持在 Window&#xff0c;macOS&#xff0c;Linux 等系统上的开发和部署&#xff0c;并且可以在硬件设备&#xff0c;云服务&#xff0c;和嵌入式/物联网方案中进行使用…

CF1526 D. Kill Anton

CF1526 D. Kill Anton 题意&#xff1a; 给你一个由’A’,‘N’.‘T’,O’四个字符组成的字符串b&#xff0c;现在要求你改变b的顺序得到a&#xff0c;使得a通过移动回到b的步数最多。 每次移动只能移动相邻两项 题解&#xff1a; 官方题解说&#xff1a;最佳情况为相同字符…

ASP.NET Core 3.0预览版体验

目前.NET Core 3.0的版本为.NET Core 3.0 Preview 3&#xff0c;对应ASP.NET Core 3.0 Preview 3。ASP.NET Core 3.0 之后将不再支持.NET Framework&#xff0c;只运行在.NET Core 上面。ASP.NET Core 3.0 现在已经出到了第三个预览版&#xff0c;增加和改进了很多功能。环境准…

C# .net 中 Timeout 的处理及遇到的问题

C# 中 Timeout 的处理前言最近在项目中要实现一个功能&#xff0c;是关于 Timeout 的&#xff0c;主要是要在要在 TCP 连接建立的时间 和 整个请求完成的时间&#xff0c;在这两个时间层面上&#xff0c;如果超出了设置的时间&#xff0c;就抛出异常&#xff0c;程序中断。研究…