MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
最近在研究亿级数据的时候,无意中看到了一个关于写58同城的文章
https://blog.csdn.net/admin1973/article/details/55251499?from=timeline
其实上面讲的version+ext的方式以及压缩json的思路,对于我来讲都可以看得懂,想得通,其实最感兴趣的还是他们那个E-Search架构,然后开始进行实验和研究其算法。
上图是从那篇文章里扒出来的图,是由他们58几个牛人写的,并维护的。
按照我的理解一步一步的进行逻辑剖析,有误的话希望大婶们及时评论改正。
分析思路开始:
tid | uid | time | cateid | ext |
1 | 1 | 123 | 招聘 | {"job":"driver","salary":8000,"location":"bj"} |
2 | 1 | 345 | 房产 | {"rent":1000,"location":"dl","acreage":120} |
3 | 1 | 567 | 二手 | {"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,最后就可以实现两个库的一致性。
MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索相关推荐
- MySQL 亿级数据需求的优化思路(一),交易流水记录的查询
对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以下是在实验的过程中做一些操作,以及踩过的一些坑,我觉 ...
- mysql单机在线迁移_MySQL 不停服务 在线进行100亿数据迁移切换
MySQL 不停服务 在线进行100亿数据迁移切换 背景: 促销库压力巨大,单实例已经不足以提供写入性能,虽然有256个分表,但是经常io打满,总数据量已经达到100亿,单实例io已经支撑不住,所以方 ...
- 每天数百亿用户行为数据,美团点评怎么实现秒级转化分析?
导读 用户行为分析是数据分析中非常重要的一项内容,在统计活跃用户,分析留存和转化率,改进产品体验.推动用户增长等领域有重要作用.美团点评每天收集的用户行为日志达到数百亿条,如何在海量数据集上实现对用户 ...
- MYSQL千万级数据量的优化方法积累
为什么80%的码农都做不了架构师?>>> 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 whe ...
- php mysql百万级数据_PHP+MySQL百万级数据插入的优化
插入分析 MySQL中插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例: 连接:(3) 发送查询给服务器:(2) 分析查询:(2) 插入记录:(1x记录大小) 插入索引:(1x索引) 关闭 ...
- mysql 查看表是否存在_MySQL优化篇二
单表优化 最佳左前缀原则为,保持索引的定义和使用顺序的一致性 将含In的范围查询,放到where条件语句的最后. 索引需要逐步优化 两表优化 小表驱动大表 避免索引失效的一些原则: 复合索引,不要跨列 ...
- 【mysql必知必会】第十二章 汇总数据
1.聚集函数(aggregate function):运行在行组上,计算和返回单个值得函数. AVG() 返回某列的平均值 COUNT() 返回某列的行数 MAX() 返回某列的最大值 MIN() 返 ...
- 怎么导出mysql数据库注释_数据库基础:如何查看并导出数据表中字段的注释信息...
查看并导出SQL Server 2000数据表中字段的注释信息: 此示例为导出某个表注释的语句:(表名是bbs_bank_log) SELECT sysobjects.name AS 表名, sysc ...
- 亿级数据多条件组合查询——秒级响应解决方案
1 概述 组合查询为多条件组合查询,在很多场景下都有使用.购物网站中通过勾选类别.价格.销售量范围等属性来对所有的商品进行筛选,筛选出满足客户需要的商品,这是一种典型的组合查询.在小数据量的情况下,后 ...
最新文章
- 学习笔记Hadoop(十三)—— MapReduce开发入门(1)—— MapReduce开发环境搭建、MapReduce单词计数源码分析
- C语言makefile文件
- 如何自行分析定位SAP BSP错误
- 电脑下面的任务栏怎么取消隐藏_电脑工具栏怎么调到下面
- 【Trie】【费用流】管道监控(loj 3026)
- 【课程】MIT深度学习课程:架起理论与实践的桥梁
- MDSpreadView
- Navicat连接虚拟机Linux的数据库时,出现错误代码“10038”
- ThreadLocal 解决多线程程序的并发问题+事务处理
- matlab线性数据毛刺剔除,matlab滤波技术及区域处理---线性滤波
- R语言向量自回归模型(VAR)及其实现
- ASCII码值是怎么计算的,怎么计算arccos的值
- 各种国内地图坐标系总结
- 单片机课设波形发生器 产生方波、三角波、正弦波、锯齿波 波形幅度可调、频率可调
- 企业微信的表格和word里单元格内如何换行【Alt+Enter】
- java swing 抽奖程序_java swing抽奖程序
- C语言实现单链表头插法
- 贝塞尔曲线 unity两点画曲线弧线三点
- 流量都去哪儿了——三板斧搞定Android网络流量测试
- java 日期处理类
热门文章
- 编程挑战系统的输入和输出详细说明
- 10位IT领袖给应届毕业生的10条忠告
- mysql sqlsugar_.net core +mysqlSugar(最为简单的增删改查)
- 【C++基础】异常处理机制概要
- Java字符类isUpperCase()方法与示例
- TomCat使用以及端口号被占用的处理方法
- 面向对象(匿名内部类在开发中的应用)
- 显卡测试软件毛毛虫,超龙超龙,与众不同,顶流配备,散热一流,3070Ti超龙旗舰版评测...
- java求水电费_java水电费管理系统
- uva 10003——Cutting Sticks