MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索

最近在研究亿级数据的时候,无意中看到了一个关于写58同城的文章

https://blog.csdn.net/admin1973/article/details/55251499?from=timeline

其实上面讲的version+ext的方式以及压缩json的思路,对于我来讲都可以看得懂,想得通,其实最感兴趣的还是他们那个E-Search架构,然后开始进行实验和研究其算法。

上图是从那篇文章里扒出来的图,是由他们58几个牛人写的,并维护的。

按照我的理解一步一步的进行逻辑剖析,有误的话希望大婶们及时评论改正。 

分析思路开始:

tiduidtimecateidext
11123招聘{"job":"driver","salary":8000,"location":"bj"}
21345房产{"rent":1000,"location":"dl","acreage":120}
31567二手{"type":"iphone","money",200}

这个是文章里提到的数据表结构,ext存这比较多可扩展的属性。然后E-Search就是要对这些属性进行快速的查询搜索。

里面提到了Searcher1 Searcher2,就是一个个用于建立索引用的表。

比如房产:

 

房产现在里面有三个字段,每一个字段对应一张表或多张表,因为字段数据到一定数量的时候,可能单台服务器的存储空间不够了,所以需要分库分表。分表可以按照Hash算法,然后切割成单台服务器可以容下的数量范围,在超过一定冗余范围,就要增加一台冗余服务器,继续分库分表。上面的例子,按照每张表存储100万数据的方式存储。

里面提到merger服务,合并层,并且强调了,增加机器就可以扩容,同时也说明了服务启动时可以加载索引数据到内存,请求访问时从内存中load数据,访问速度很快。

那这个merger要做些什么呢?应该怎么做呢?

好了,现在分析业务需求,咱们模拟一个场景和一个查询需求,分析一下整体是怎么工作的。

在看了58同城网站时候,发现了几个特点。

一、有分页,但是没有一共多少条的分析和统计

二、检索条件是可以随意的设定,有很多的条件可以进行添加

然后我们沿着我们的表设计开始进行模拟一个搜索过程。

那么,我们假设几个查询条件

价格:1700~2500

地址:大连 (dl)

面积:190平米以内

按照价格从低到高进行排序

分页每页10条

按照以上的查询条件,我们分别在这六张表上进行搜索。

租金:Table1 2000条,Table2 500条,一共2500条

地址:Table3 999993条,Table4 8条,一共 1000001条

面积:Table5 5000条

下一步,当然就要把这些条件查询的结果进行合并,就是所谓的merger要做的事。

首先,要知道排序要用价格从低到高进行排序,我们知道查询结果就是按照索引进行排序好的排序文件,大小就是12345这样从低到高进行索引的。那就从Table1开始循环,因为是and关系,只要数据既符合地址的条件,又符合面积的条件,就算合格一条,只要累积满足了10条,就可以返回了。这个时候,其他的条件加载在内存里,但怎么比较比较快呢?

这时候,就涉及到Hash算法了,比如Java有个HashMap,我们可以把其他数据全部加载到HashMap里,然后Table1每循环一次要用containsKey方法,与其他的表进行确认一下是否存在,由于Hash算法速度很快,就可以很快的凑出来前10条。

这个时候,第一页的结果就完成了。

那么,就要问了,第二页,第三页,第四页怎么办?

在我们循环Table1的时候,会有一个循环的游标位置,index,比如凑了10条,游标游到了25才凑齐返回,那我们就把这个25一同返回,作为下一页的起点。

由于系统不需要统计一共查询多少结果,所以我们依次往下迭代就可以了。

前台得到了25这个游标,那么,下一页直接从Table1结果25在往后开始循环寻找条件符合的数据,凑成10条,并且返回index ,依次往后进行。

 

其他问题总结:

一、索引表冗余问题

就像那个文章所说的,系统不要求一致性,所以每次有新的数据插入,在插入Ext表之后,分别给到searcher的索引表里,进行更新索引,当某个字段索引表空间不够了,增加冗余服务器,进行切分数据以保证重建索引速度及存放空间能力。

二、merger服务冗余问题

由于merger服务与索引表在同一服务器上,当表控件需要增加的时候,merger服务也随着增加,同时要保证这台服务器的内存能够可以实现单表最大数据存储计算能力。

三、EXT数据的冗余问题

直接就按照UID的增加,如果单台服务器不够,直接增加

四、100亿数据导入问题

有个100亿的数据问题,要求从Oracle数据库导入到MySql下。要求原系统不能停,还要求最后的数据是一致的。这个思路就是,把MySql进行分库分表规划好后,进行导数据,并且业务系统在不停的情况下产生的新的操作,同时更新Oracle和MySql,最后就可以实现两个库的一致性。 

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

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

相关文章

RUNOOB python练习题3

用来练手的python 练习题,原链接 : python练习实例3 拿到题目就写了如下代码,思路是因为使用**0.5进行开平方操作时,python会将数据类型自动转换为float单精度浮点型。这里利用提取其整数部分,来判断这个数是否是完全平方数。 z…

使用git将项目上传到github(最简单方法)

使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可&#xff1…

RUNOOB python练习题4

用来练手的python习题其四, 原题链接: python练习实例4 题干: 输入某年某月某日,判断这一天是这一年的第几天? 这个题目比较简单,只需要注意闰年和非闰年的区别就可以了。我这里使用numpy矩阵存储每个月的天数,之后用…

GitHub入门:如何上传与下载工程?

由于经常要在家写代码,所以需要有个能够方便访问代码管理工具。最近尝试了一下GitHub。经过了一翻纠结之后,基本上掌握了他的使用方式。 要使用GitHub需要首先在其网站上进行注册。其官方网站是https://github.com/。注册的流程在这里就不多少了&#x…

如何解决PIP命令不可用

今天想用PIP装一个python包,发现PIP报错,不是内部或外部命令。。。 遇事百度,有两种说法,一,没安装包,不管那么多命令执行了再说 在命令行输入:python -m ensurepip 将pip.exe文件下载下来 再pi…

RUNOOB python练习题5

用来练手的python 练习题其五,原链接 : python练习实例5 题干 : 输入三个整数x,y,z,请把这三个数由小到大输出。 又是非常简单的排序算法,只要使用numpy矩阵的排序方法或者使用python list的排序算法就可以轻松解决。 源代码如下 : import …

初步使用github,并上传下载文件

使用GitHub需要先注册GitHub的账号,登陆进去 然后开始创建项目 start a project 创建完成,开始生成公私钥,可以不必每次都要输密码 ssh-keygen -t rsa -C "mghxy123163.com" //填写email地址,然后一直“回车”ok 然后把公钥导入GitHub中的key里面去,也…

NOIP2000提高组复赛C 单词接龙

题目链接:https://ac.nowcoder.com/acm/contest/248/C 题目大意: 略 分析: 注意点:1.前缀和后缀的公共部分应该选最短的。2.如果两个字符串前缀和后缀的公共部分恰好是其中一个字符串,那么这两个字符串不能合并。 代码…

右键Git Bash Here不见了怎么办,手把手教你还原!

第一步,window R,输入regedit回车进入注册表 依次进入HKEY_CLASSES_ROOT —-》 Directory —-》Background —-》 shell 右键点击shell,选择新建,然后选择项,命名为 Git Bash Here,成功后进入桌面右键发现…

RUNOOB python练习题6 斐波那契数列

用来练手的python 练习题其六,原链接 : python练习实例6 题干 : 斐波那契数列 斐波那契数列可以说是很好的递归理解工具了,这里就用递归实现一下斐波那契数列。 源代码如下: # 返回fibonacci数列中某一项的数值 def Fibonacci(n):if n 1:return 1eli…

github windows客户端

方法/步骤 1 1. 首先到官网下载Github客户端 2 2. 点击上图红框的按钮开始下载客户端。 3 3. 双击下载好的客户端,开始安装。 4 双击之后出现一个框 5 之后等待一段时间,出现一个在线下载界面 6 4. 在线下载完成之后开始进行安装。安装完成之后…

赋值语句 变量的地址相关 : RUNOOB python练习题7

用来练手的python 练习题,原链接 : python练习实例7 练习实例7非常的简单也有意思。题干 : 将一个列表的数据复制到另一个列表中。 完成这个操作的代码非常简单,即使是我这样的初学者应该也是一语道破,赋值语句嘛。但这里我们就列举出几种不…

Web标准的概念及组成

一周更新两个或三个关于web前端的知识点,欢迎感兴趣的小伙伴们一起学习讨论1、WEB标准是网页制作的标准,它不是一个标准,它是根据网页的不同组成部分生成的一系列标准。这些标准大部分由W3C起草发布,也有部分标准由ECMA起草发布。…

Fiddler简介及安装和HTTPS的解决

Fiddler简介: 一个很强大的抓包工具,类似Charles 1.安装: Filddler官网:点击打开链接 我安装的是filddler4:点击打开链接 直接下载文件,然后一路下一步就可以了 1.下载文件: 2.安装文件一…

RUNOOB python练习题8 numpy矩阵的索引及遍历

用来练手的python 练习题,原链接 : python练习实例8 题干: 输出 9*9 乘法口诀表。 import numpy as nptable np.zeros((9,9)) for i in range(table.shape[0]):for j in range(table.shape[1]):table[i][j] (i1) * (j1)# 查询九九乘法表 def affichage_table(a,…

ddt源码修改:HtmlTestRunner报告依据接口名显示用例名字

做接口测试,使用unittestddtexcel ,使用HtmlTetstRunner来生成测试用例。 查看报告的时候 用例名称都是 test_api_1 、test_api_2 、test_api_3 的显示 ,看的不爽,也不明确,如果是test_api_登陆成功 、 test_api_密码错误 …

Fiddler抓取https设置及其原理

Fiddler抓取https设置及其原理 2018-02-02 目录 1 HTTPS握手过程 2 Fiddler抓取HTTPS过程 3 Fiddler抓取HTTPS设置参考 数字签名是什么? 1 HTTPS握手过程 HTTPS 并非是应用层的一种新协议。只是 HTTP 通信接口部分用 SSL (安全套接字层)和…

RUNOOB python练习题10

用来练手的python 练习题,原链接 : python练习实例9 题干 : 暂停两秒输出,并格式化当前时间。 import time,datetimeTIME datetime.datetime.now() print(TIME.strftime("%Y.%m.%d %H-%M-%S")) time.sleep(2) TIME datetime.datetime.now(…

HTTPS连接过程以及中间人攻击劫持

HTTPS连接过程以及中间人攻击劫持 目前很多应用都用webview加载H5页面,如果服务端采用的是可信CA颁发的证书,在 webView.setWebViewClient(webviewClient) 时重载 WebViewClient的onReceivedSslError() ,如果出现证书错误,直接调…

RUNOOB python练习题12 找素数问题

用来练手的python 练习题,原链接 : python练习实例12 题干 : 判断101-200之间有多少个素数,并输出所有素数 源代码如下: import numpy as np bound np.arange(101,201,1) result np.array([]) for k in bound:for i in range(k):# 如果k存在不是1或…