大数据翻页的难点和技巧_数据分析师
大数据,如何优化方案做到性能与成本的平衡。我们经常会遇到一种Key-list类型数据, 如一个用户的好友关系 {“uid”:{1,2,3,4,5}},表示uid包含有5个好友;一条微博下面的评论id列表{“weibo_id”: {comment_id1, comment_id2……}},一个用户发表的微博id列表等。
在list长度较少时候,我们可以直接的使用数据库的翻页功能,如
1
|
SELECT * FROM LIST_TABLE LIMIT offset, row_count;
|
根据经验,在大部分场景下,单个业务的list数据长度99%在1000条以下,在数据规模较小时候,上面的方法非常适合。但剩下的1%的数据可能多达100万条,在数据规模较大的时候,当访问offset较大的数据,上述方法非常低效,但在实现方案的时候不能忽视这些超大数据集的问题,因此要实现一个适合各种变长list的翻页方案,考虑到数据的长尾问题,并没有简单高效的方案。这也体现了常说的80%+的时间在优化20%-的功能。
List数据访问模型常见的有两种方式
扶梯方式在导航上通常只提供上一页/下一页这两种模式,部分产品甚至不提供上一页功能,只提供一种“更多/more”的方式,也有下拉自动加载更多的方式,在技术上都可以归纳成扶梯方式。
(图:blogspot的导航条)
(图:很多瀑布流式的产品只提供一个more的导航条)
扶梯方式在技术实现上比较简单及高效,根据当前页最后一条的偏移往后获取一页即可,在MySQL可使用以下方法实现。
1
|
SELECT * FROM LIST_TABLE WHERE id > offset_id LIMIT n;
|
|
|
由于where条件中指定了位置,因此算法复杂度是O(log n)
另外一种数据获取方式在产品上体现成精确的翻页方式,如1,2,3……n,同时在导航上也可以由用户输入直达n页。国内大部分产品经理对电梯方式有特殊的喜好,如图
但电梯方式在技术实现上相对成本较高,当使用以下SQL时
1
|
SELECT * FROM LIST_TABLE LIMIT offset, row_count;
|
|
|
我们可以使用MySQL explain来分析,从下文可以看到,当offset=10000时候,实际上MySQL也扫描了10000行记录。
为什么会这样?在MySQL中,索引通常是b-tree方式(但存储引擎如InnoDB实际是b+tree),如图
从图中可以看到,使用电梯方式时候,当用户指定翻到第n页时候,并没有直接方法寻址到该位置,而是需要从第一楼逐个count,scan到 count*page时候,获取数据才真正开始,所以导致效率不高。对应的算法复杂度是O(n),n指offset,也就是page*count。
另外Offset并不能有效的缓存,这是由于
1、在数据存在新增及删除的情况下,只要有一条变化,原先的楼层可能会全部发生变化。在一个用户并发访问的场景,频繁变化的场景比较常见。
2、电梯使用比较离散,可能一个20万条的list,用户使用了一次电梯直达100楼之后就走了,这样即使缓存100楼之下全部数据也不能得到有效利用。
以上描述的场景属于单机版本,在数据规模较大时候,互联网系统通常使用分库的方式来保存,实现方法更为复杂。
在面向用户的产品中,数据分片通常会将同一用户的数据存在相同的分区,以便更有效率的获取当前用户的数据。如下图所示
(图:数据按用户uid进行hash拆分)
图中的不同年份的数据的格子是逻辑概念,实际上同一用户的数据是保存在一张表中。因此方案在常见的使用场景中存在很大不足,大部分产品用户只访问最 近产生的数据,历史的数据只有极小的概率被访问到,因此同一个区域内部的数据访问是非常不均匀,如图中2014年生成的属于热数据,2012年以前的属于 冷数据,只有极低的概率被访问到。但为了承担红色部分的访问,数据库通常需要高速昂贵的设备如SSD,因此上面方案所有的数据都需要存在SSD设备中,即 使这些数据已经不被访问。
简单的解决方案是按时间远近将数据进行进一步分区,如图。
注意在上图中使用时间方式sharding之后,在一个时间分区内,也需要用前一种方案将数据进行sharding,因为一个时间片区通常也无法用一台服务器容纳。
上面的方案较好的解决了具体场景对于key list访问性能及成本的平衡,但是它存在以下不足
数据按时间进行滚动无法全自动,需要较多人为介入或干预
数据时间维度需要根据访问数据及模型进行精巧的设计,如果希望实现一个公用的key-list服务来存储所有业务的数据,这个公用服务可能很难实现
为了实现电梯直达功能,需要增加额外的二级索引,比如2013年某用户总共有多少条记录
由于以上问题,尤其是二级索引的引入,显然它不是理想中的key list实现,后文继续介绍适合大数据翻页key list设计的一些思路及尝试。文章来源:CDA数据分析师认证官网
数据分析咨询请扫描二维码
必备的职业技能 统计学基础 - 理解概率、假设检验、回归分析等统计概念。 - 运用统计方法对数据进行分析和解读。 编程能力 - 掌 ...
2024-11-27基础课程 - 统计学基础: 统计学是数据分析的基石,包括概率、假设检验、回归分析等基本知识。这有助于分析师更好地理解数据背后 ...
2024-11-27数据分析领域涉及众多工具软件,涵盖了从数据处理、分析到可视化的各个方面。在选择适合自己需求的工具时,需要考虑数据规模、分 ...
2024-11-27在数据分析领域,选择合适的工具至关重要。不同的软件适用于不同的需求和技能水平。以下是几款值得考虑的数据分析软件: - Table ...
2024-11-27数据分析中常用的Excel与Python函数公式涵盖了广泛的应用场景。掌握这些基础和高级技巧对于成为一名优秀的数据分析师至关重要。 ...
2024-11-27Python是一种高级编程语言,由荷兰程序员Guido van Rossum于1989年圣诞节期间开始开发,并于1991年首次发布。Python的设计哲学强 ...
2024-11-27课程内容 数学基础: 高等数学、线性代数、概率论与数理统计、微积分等为算法设计和数据分析打下基础。 编程与算法: 掌握 ...
2024-11-27爬虫工程师是互联网时代中至关重要的职业之一,他们的工作内容主要涉及编写和维护网络爬虫程序,进行数据采集与清洗,设计系统架 ...
2024-11-27技能需求 数据管理与建模 - 掌握SQL、HiveQL、Spark SQL等数据库语言,进行复杂数据查询和分析。 - 使用数据建模工具如ER/Studio ...
2024-11-27技术技能 - 编程技能 - 掌握SQL、Python、R语言等编程工具是基本要求,可用于数据提取、清洗和分析。 - 数据分析与建模技能 ...
2024-11-27财务数据分析职业展望 - 需求激增: 随着企业信息化和数字化进程的加速,财务数据产生和积累速度急剧增长,推动了财务数据分析需 ...
2024-11-27技术技能 数学与统计技能:数据分析师需要具备扎实的数学基础,包括统计学、概率论、多变量微积分和线性代数等知识,以帮助理 ...
2024-11-27选择适当的工具和软件 选择恰当的工具对于创建出色的数据分析图表至关重要。Excel提供强大的数据可视化功能,R语言的ggplot2包 ...
2024-11-27初级市场分析师在工作中面临着重要任务之一:评估竞争对手的表现。这项工作不仅有助于描绘行业竞争格局,还能帮助企业发现自身的 ...
2024-11-27基础知识的建立 要想在数据分析领域脱颖而出,首先需要打好坚实的基础。 数据分析的基础知识十分重要,其中包括统计学、概率论、 ...
2024-11-27# 要学习Python数据分析 掌握Python基础知识 - 首先需要掌握Python的基础知识,包括基本语法、数据结构(如列表、元组、字典等) ...
2024-11-27学数据分析能在什么单位工作 数据分析的就业领域概述 数据分析专业毕业生广泛应用于各行各业,包括但不限于以下单位: 政府机关 ...
2024-11-27想学数据分析需要学哪些课程 数据分析学习路径推荐 基础课程: 统计学: 统计学作为数据分析的基石,涵盖概率论、描述性统计、 ...
2024-11-27# 现在什么行业发展前景最好 **人工智能与机器学习** - 人工智能技术快速发展,广泛应用于智能家居、自动驾驶等领域。 - 具备巨 ...
2024-11-27# 未来最有前景的行业 **人工智能与机器学习** - 人工智能被认为是未来最具潜力的行业之一,其应用范围广泛,包括智能家居、医 ...
2024-11-27