数据蒋堂 | 时序数据从分表到分库

2024-04-13 23:48

本文主要是介绍数据蒋堂 | 时序数据从分表到分库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

640?wx_fmt=png

作者:蒋步星

来源:数据蒋堂

本文共5500字,建议阅读10+分钟
一个物理表的数据量太大时,就会影响查询和计算的性能。


640?wx_fmt=png


这里的时序数据泛指一切随时间推移而不断增长的数据,比如通话记录、银行交易记录等。


对于数据库来讲,时序数据并没有什么特殊性,可以和普通数据一样放在数据表中。不过,因为不断增长,积累时间较长后,这种数据的量常常都会很大。一个物理表的数据量太大时,就会影响查询和计算的性能。


现代数据库一般都提供有表分区(PARTITION)的机制,就是把一个大表纵向(按行)分成若干区段,分区规则由数据库管理员来设置,对应用程序员来讲是透明的,可以和不分区的表一样访问,数据库会自动根据查询条件决定读取哪些分区的数据,这样的接口体验非常好。


不过,在实战中,分区表的效果在某些场景下并不好,而且使用时也有些约束条件,并不总好用且能用的。结果,在实际业务中,我们常常会看到对于这种大数据采用手工物理分表的方案。




所谓物理分表,就是人为将一个大表分成若干较小的物理数据表。因为时序数据的结构中一定会有一个字段来表示事件发生的时刻,而事件发生的数量一般来讲也会按时间段相对平均分布(大多数情况会缓慢增长,但讨论时可以忽略),所以最常用的方案就是按时间段来做分表,比如一个月数据对应一个分表,这种方式在金融、电信行业比较普遍。


物理分表并不是数据库自动支持的方案,不能对应用程序做到透明,需要应用程序自己处理。在查询数据时一般都会有时间段参数,应用程序可以根据这个参数计算出该查询涉及哪些分表,然后将这些分表UNION起来拼到SQL语句的FROM后面。查询不涉及的时间段对应的分表不会被拼进来,这样就可以有效减少数据遍历的范围,从而提高性能。




这个方案在单个数据库时没啥毛病,但是不是能推广到多个数据库的情况呢?


数据量再大下去,一个数据库也无法承受了,而某些场景下又不允许我们上一套分布式数据库系统,毕竟分布式数据库是个沉重的工程,不仅造价高,而且维护管理都要复杂不少。这时候,我们可以摆多个数据库分别存储数据,类似物理分表的方案,也按时间段把数据分拆到各个数据库中,比如一年数据放入一个数据库中(一般来讲多个库会部署到多台机器上),这样就能分摊查询压力了。


这首先会有一个查询范围的问题,如果查询的时间跨度超过了一个物理分库时,这时候就不能象分表时那样用UNION拼起来了,数据库无法执行跨库的SQL语句。不过,这个问题还不算严重,只是查询明细数据时,要把各个分库的返回数据拼接起来,这并不算困难。甚至,要求前端查询范围必须落在一个分库内也不为过(比如必须先选择查询年份),因为一个分库的数据量并不算少,这样用户体验略有损失,但也可以容忍。


这种方案还会有压力不平衡的问题。


对于时序数据,近期数据的查询频繁度远远高于远期数据,大多数查询都集中在最近一段时间中,存放近期数据的分库上任务就很重,并发较多时仍然会有性能瓶颈,而存放远期数据的分库却几乎没事干,并不能有效分摊查询压力。




还有别的办法吗?


可以采用蛇形分布。比如将多年数据分拆到10个分库中,可以按日期拆分,所有年份中1月1日的数据放到1号分库中,1月2日的放到2号分库,…,1月10号的放到10号分库,1月11号的再从1号分库轮回,…;其它情况的具体分法也可以根据时序数据的时刻字段的分布情况来决定。


这样分下来,每个分库存储的数据量差不多也就是1/n,相对比较平均,还可以规避前面说的数据缓慢增长导致的不平衡;而且,无论近期数据还是远期数据的查询都会被分摊到各个分库中,看起来能够充分利用硬件资源了。


还有点注意事项!


蛇形分布时,每个分库中都有所有年份的数据,几乎每个查询都会涉及到所有分库的数据,不能只挑出某些分库来执行运算,这和前面说的分表方案的优化原理并不一样了。我们需要在分库中继续做分表,查询确实会涉及所有分库,但只涉及分库中的某些分表,这样仍然可以有效的减少查询范围,同时利用分库并行的优势。


第二个问题:每个分库都可能返回数据,应用程序需要把这些数据再做一次汇总,而不能象单库分表那样用UNION推给数据库去完成。对于常见的明细查询,那只要简单拼接再排序就可以了,开发起来并不难;但如果涉及到分组汇总就会麻烦很多,应用程序员并不擅长编写这种运算,这时候最好借助集算器这类外部计算引擎来协助实现跨库汇总运算。




当然,成本和条件允许时直接上分布式数据库就更简单,分布式数据库采用HASH方案基本上可以被理解成是蛇形分布的。


专栏作者简介

640?

润乾软件创始人、首席科学家


清华大学计算机硕士,中国大数据产业生态联盟专家委员,著有《非线性报表模型原理》等,1989年,中国首个国际奥林匹克数学竞赛团体冠军成员,个人金牌;2000年,创立润乾公司;2004年,首次在润乾报表中提出非线性报表模型,完美解决了中国式复杂报表制表难题,目前该模型已经成为报表行业的标准;2014年,经过7年开发,润乾软件发布不依赖关系代数模型的计算引擎——集算器,有效地提高了复杂结构化大数据计算的开发和运算效率;2015年,润乾软件被福布斯中文网站评为“2015福布斯中国非上市潜力企业100强”;2016、2017年,荣获中国电子信息产业发展研究院评选的“中国软件和信息服务业十大领军人物”;2017年度中国数据大工匠、数据领域专业技术讲堂《数据蒋堂》创办者。


数据蒋堂

《数据蒋堂》的作者蒋步星,从事信息系统建设和数据处理长达20多年的时间。他丰富的工程经验与深厚的理论功底相互融合、创新思想与传统观念的相互碰撞,虚拟与现实的相互交织,产生出了一篇篇的沥血之作。此连载的内容涉及从数据呈现、采集到加工计算再到存储以及挖掘等各个方面。大可观数据世界之远景、小可看技术疑难之细节。针对数据领域一些技术难点,站在研发人员的角度从浅入深,进行全方位、360度无死角深度剖析;对于一些业内观点,站在技术人员角度阐述自己的思考和理解。蒋步星还会对大数据的发展,站在业内专家角度给予预测和推断。静下心来认真研读你会发现,《数据蒋堂》的文章,有的会让用户避免重复前人走过的弯路,有的会让攻城狮面对扎心的难题茅塞顿开,有的会为初入行业的读者提供一把开启数据世界的钥匙,有的甚至会让业内专家大跌眼镜,产生思想交锋。


数据蒋堂第二年往期回顾:


数据蒋堂 | 存储和计算技术的选择

数据蒋堂 | 人工智能中的“人工”

数据蒋堂 | 中国报表漫谈

数据蒋堂 | 内存数据集产生的隐性成本

数据蒋堂 | 多维分析预汇总的功能盲区

数据蒋堂 | 多维分析预汇总的存储容量

数据蒋堂 | 多维分析预汇总的方案探讨

数据蒋堂 | 数据库的封闭性

数据蒋堂 | 内存数据集产生的隐性成本

数据蒋堂 | 前半有序的大数据排序

数据蒋堂 | “后半”有序的分组

640?wx_fmt=jpeg

这篇关于数据蒋堂 | 时序数据从分表到分库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/901557

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解