大数据优化--案例分析

1、分页目的

分页查询在软件开发中是极为常见的查询方式。计算机资源是有限的,尤其是内存资源。当要查询的数据为海量数据时,一次性加载所有数据显然是不可行的也不合理。会导致服务响应时间变长,吞吐量减小,内存溢出,严重的话还会引发由点到面的服务雪崩,最终导致整个系统不可用。使用分页,每次只查询一部分数据,减少内存消耗,减小响应时间,提高系统性能,提高系统稳定性,从而提高用户体验。

2、常见分页

最常见方式:offset + size

select * from t_user limit offset,size;

第 1 页:

select * from t_user limit 0,10;
select * from t_user limit 10;

第 100 页:

select * from t_user limit 990,10;

注:基于 B+ 数据结构。


image.png

分页查询执行过程:
第 1 页:

select * from t_user limit 0,10;

上面select后面带*,也就是要求获取记录行的所有列字段信息。
数据库服务层调用存储引擎接口,存储引擎在主键索引中读取0到10条完整数据返回数据库服务层,服务层把数据返回给调用客户端(可以是navicat ,SQLyog,Java驱动等)

第100页

select * from t_user limit 990,10;

数据库服务层会调用存储引擎接口,由于这次的offset=990,会在存储引擎的主键索引中获取到第0到(990+ 10)条完整行数据,返回给数据库服务层之后根据offset的值挨个抛弃,最后只留下最后面的size条,也就是10条数据,放到数据库服务层的结果集中,返回给客户端。可以看到,当offset越大,数据库服务层从存储引擎拉取的无用数据就越多,拉取这些无用的数据是要消耗机器磁盘IO、内存、CPU资源和增加响应耗时的。
针对上面查100页的优化

select * from t_user where id >= (select id from t_user order by id limit 990, 1) limit 10;

这里会先执行子查询 【select id from t_user order by id limit 990, 1】 这个操作,其实也是在存储引擎的主键索引中获取到(990+ 1)条数据,然后数据库服务层会抛弃前990条,只保留最后一条数据的id。但不同在于,在返回数据库服务层的过程中,只会拷贝数据行内的id这一列,而不会拷贝数据行的所有列,当数据量较大时,这部分的耗时还是比较明显的。
在拿到了上面的id之后,假设这个id正好等于990,那SQL就变成了:

select * from t_user where id >= 990 limit 10;

这和查第 1 页的逻辑就基本一样了。

3、深分页

当随着offset越来越大,甚至达到百万千万级别,俨然就变成了深分页问题。而深分页是无解的,随机深分页更致命。


image.png

如上图:把数据的所有页数都展示出来,并且可以随机点击想要的页数,这种就是常见的随机跳页。而当数据是海量的时候就形成了所谓的随机深分页问题。这种问题是没有解的。应该在设计的时候就要避免出现深随机深分页的场景。如果深分页没法避免,那就只限制小幅度跳页。下面我们看下大企业的分页设计:
百度:


image.png

bing:
image.png

Google:


image.png

从上面各大公司分页设计方案看出,即使是搞搜索引擎的大厂也没有一家是支持随机深分页的。

4、分页方案

常见的分页方案:利用已知条件分页,分库分表,利用搜索引擎等。
分库分表:原理是减小单表数据
搜索引擎:利用搜索引擎对大数据的处理能力
已知条件分页:
其实前面讲了当offset较大时,对分页语句进行了优化的思路很接近了。

select * from t_user limit 990,10;
select * from t_user where id >= (select id from t_user order by id limit 990, 1) limit 10;

在优化后的语句中子查询返回的id就是一个已知条件,后面查询的时候直接让【id>=990】,在这里990就是已知条件,只不过这个条件是数据库层面自己计算得到的。那是不是可以想办法我们认为的给出这个条件,答案是很定的,但这需要在交互设计上要配合。比如:
加载更多:可以设计成不显示页面,而变成加载更多,点击加载的时候给接口传参为上一次加载数据中最后一条数据的id。
语句如下

select * from t_user where id >= lastId

小范围点击跳页查询:如上面举例的百度、bing、Google 等就是小范围跳页方案,原理就是根据查询出的数据的最后一个id + 跳几页*每页大小。
比如:从第1页跳到第3页,那么对于第1页的最后1条数据的id索引位置来说往后移动1页即可
语句如下:

select * from t_user where id > lastId limit((3-1-1)*10),10;

5、搜索引擎优化

5.1、问题场景

系统上线多年,产生的数据累计达到一定量,系统的搜索慢查询越来越突出,特别是在早中晚高峰,服务的各种系统资源都在高位负载,磁盘资源尤其突出,随时有宕机风险。

5.2、系统架构:

image.png

5.3、存在问题:

1、搜索引擎使用的是ES5.x版本,支持父子索引结构。建立的索引为:1 + 5 模式,用到关联查询,但随着生产的数据量越来越大了,关联查询的弊端就显示出来。
2、es 单个索引字段数默认为1000个。而系统表单为动态表单,理论上用户可以无限拉表单字段,而一个字段会映射为一个索引字段。


image.png

3、es5.x 没鉴权能力
4、mongosync 为单点结构

5.4、解决方案:

1、使用宽表设计,以主表为维度,把和主表相关联的数据通过清洗组织存储到同一个索引中,到达了只查询一张索引就能满足以前的业务。
2、多字段问题,实际上系统中的控件也就是30来个,如果能按类型类存储到ES那就还很的解决了字段膨胀问题。

{
    "te_0":"单行文本0",
    "te_1":"单行文本1",
    ...
    "te_n":"单行文本2",
}

[
    {
        "Key":"te_0",
        "Value":"单行文本0"
    },
    {
        "Key":"te_1",
        "Value":"单行文本1"
    },
    {
        "Key":"te_2",
        "Value":"单行文本2"
    }
]

如上所示,原来需要的 n 个字段类型,现在只需2个就可以解决 Key,Value。
3、升级到es7,但要支撑私有云,代码要支持两个版本的ES搜索引擎,这回导致jar冲突。为了解决这个问题新的搜索访问代码直接通过 http 方式调用。
4、mongosync 数据同步平台


image.png

使用ZK分布式协调组件的创建唯一节点能力(分布式锁)和 watcher 机制。分布式锁保证了主节点的唯一性,watcher机制保证了高可用。

选主、活检

6、数据治理

6.1、问题场景

系统上线多年,数据库存储的数据越来越多,最大单表到达10亿+,慢查询频繁告警,特别是在早中晚高峰,服务的各种系统资源都在高位负载,磁盘资源尤其突出,随时有宕机风险。为了系统健康稳定发展,需要对数据进行治理。

6.2、系统架构

image.png

6.3、存在问题

问题非常明显即不管是整个数据库,还是单表数据量都非常巨大。

6.4、解决方案

6.4.1、数据分片

分片为应对高吞吐量与大数据量提供了解决方案。使用分片减少了每个分片需要处理的请求数和存储量,因此,通过水平扩展,可以提高自己的存储容量和吞吐量。

6.4.1.1、优点

对于一般应用来说几乎是可以无限且不线下扩容。代码改动量小。

6.4.1.2、缺点

缺点也显而易见,费钱。按最基本的每个集群3台机器,一共为15台。

6.4.2、冷热分离

数据库存储数据量巨大,但绝大多数的数据没有经常被访问,即存在冷数据和热数据。根据业务场景定义冷数据,然后把这部分数据迁移存储到比较廉价的机器上(冷库),以达到降本增效,提高系统稳定等。


image.png
6.4.2.1 优点

设备资源成本少。

6.4.2.2 缺点

代码改动量很大,数据路由复杂。

6.4.2.3 挑战

冷热分离后用户无感知。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容