大数据表优化(一):分库
IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《大数据表优化(一):分库》,聊聊MySQL、优化、大数据,我们一起来看看吧!
背景
业务库中有三张表数据量比较大,分别是cloud_box_event_state(事件信息表)、cloud_box_workhour(工时汇总表)、cloud_box_workhour_detail(工时明细表)。随着业务发展数据量还在增加,这些表用于存储智能硬件上报的事件信息,以及记录安装了智能硬件的设备的工作时长等。由于这三张大表的存在,业务库存储空间已经吃紧,另外智能硬件上报数据的高并发请求给业务库也带来了很大的压力。业务库已经出现响应变慢,甚至主从延迟的问题,主从延迟对业务系统影响比较大,这几张大表引发出来的问题需要解决。
分库
为了缓解业务库空间吃紧和高并发请求带来的压力,需要把大表从业务数据库拆分出去,新建一个数据库存储数据。从原来的数据库cloudbox中把三张大表cloud_box_event_state、cloud_box_workhour和cloud_box_workhour_detail拆分出来,放在cloudbox_data数据库中。此时先不要从cloudbox业务库中删除三张大表,拆分示意图如下:

多数据源
使用sharding-jdbc组件创建和管理多数据源,应用中生成两个数据源,分别是dataSource和cloudboxDataSource,其中dataSource用来访问cloudbox库,cloudboxDataSource用来访问cloudbox_data库。使用sharding-jdbc加载与创建cloudboxDataSource数据源的代码如下:
@Configuration public class SpringBootShardingJdbcConfiguration implements EnvironmentAware { private static Logger logger = LoggerFactory.getLogger(SpringBootShardingJdbcConfiguration.class); private Environment environment; private final String MASTER_SLAVE_PREFIX = "cloudboxdata.sharding.jdbc.config.masterslave"; private final String SHARDING_RULE = "cloudboxdata.sharding.jdbc.config"; private final String DATASOURCE_PREFIX = "cloudboxdata.sharding.jdbc.datasource."; @Bean @ConfigurationProperties(prefix = MASTER_SLAVE_PREFIX) public YamlMasterSlaveRuleConfiguration cloudBoxDataMasterSlaveProperties() { return new YamlMasterSlaveRuleConfiguration(); } @Bean @ConfigurationProperties(prefix = SHARDING_RULE) public YamlShardingRuleConfiguration cloudBoxDataShardingProperties() { return new YamlShardingRuleConfiguration(); } @Bean public CloudBoxDataSourceFactory cloudBoxDataSourceFactory() { CloudBoxDataSourceFactory cloudBoxDataSourceFactory = new CloudBoxDataSourceFactory(); try { cloudBoxDataSourceFactory.setCloudBoxDataSource(getCloudBoxDataSource()); } catch (SQLException e) { logger.error("initialize CloudBoxDataSourceFactory error", e); } return cloudBoxDataSourceFactory; } private DataSource getCloudBoxDataSource() throws SQLException { return Objects.isNull(cloudBoxDataMasterSlaveProperties().getMasterDataSourceName()) ? ShardingDataSourceFactory.createDataSource(getDataSourceMap(DATASOURCE_PREFIX), cloudBoxDataShardingProperties().getShardingRuleConfiguration(), cloudBoxDataShardingProperties().getConfigMap(), cloudBoxDataShardingProperties().getProps()) : MasterSlaveDataSourceFactory.createDataSource(getDataSourceMap(DATASOURCE_PREFIX), cloudBoxDataMasterSlaveProperties().getMasterSlaveRuleConfiguration(), cloudBoxDataMasterSlaveProperties().getConfigMap(), cloudBoxDataMasterSlaveProperties().getProps()); } private Map<string datasource> getDataSourceMap(String prefix) { Map<string datasource> dataSourceMap = new LinkedHashMap(); String dataSources = environment.getProperty(prefix + "names"); for (String each : dataSources.split(",")) { try { Map<string object> dataSourceProps = PropertyUtil.handle(environment, prefix + each, Map.class); Preconditions.checkState(!dataSourceProps.isEmpty(), "Wrong datasource properties!"); DataSource dataSource = DataSourceUtil.getDataSource(dataSourceProps.get("type").toString(), dataSourceProps); dataSourceMap.put(each, dataSource); } catch (final ReflectiveOperationException ex) { throw new ShardingException("Can't find datasource type!", ex); } } return dataSourceMap; } @Override public final void setEnvironment(final Environment environment) { this.environment = environment; } }</string></string></string>
数据双写
实现三张表的数据在cloudbox库和cloudbox_data库双写,确保两个数据库中的数据一模一样。
配置中心增加开关,用来实现三张表数据的查询可以在cloudbox库和cloudbox_data库之间切换,如果查询cloudbox_data库出现问题,可以很快的切换到cloudbox数据库上。如图:

数据迁移
1、在cloudbox_data库中新建copy表 2、将cloudbox库中cloud_box_workhour_detail和cloud_box_workhour数据迁移到cloudbox_data中的copy表 -- cloud_box_workhour = 2020-07-29 00:00:00 insert into cloud_box_workhour_detail_copy(imei,start_time,end_time,source,car_id) select imei,start_time,end_time,source,car_id from cloud_box_workhour_detail where start_time >= 1595952000000; 5.将cloudbox_data库中cloud_box_workhour_detail和cloud_box_workhour与copy表名称互换,执行附件20200729_3.sql rename table cloud_box_workhour to cloud_box_workhour_copy2; rename table cloud_box_workhour_detail to cloud_box_workhour_detail_copy2; rename table cloud_box_workhour_copy to cloud_box_workhour; rename table cloud_box_workhour_detail_copy to cloud_box_workhour_detail; 6.重启8084,8087,8089三个服务
线上观察
线上数据查询切换到cloudbox_data数据库,对系统数据进行验证观察,如果出现数据不正确,立马切换到cloudbox数据库,如果系统运行正常,数据正确,把三张表的数据写入切换到只操作cloudbox_data数据库。观察一周时间,没有出现问题,把cloudbox数据库中的三张表删除即可。
归档历史
分库方案解决了业务库数据库的存储压力和访问压力,但对于cloudbox_data数据库来说,本身还是存在性能问题,大表的数据写入和更新较慢,服务的吞吐能力因此有打折扣,由于表基数比较大,单表的查询性能也不是很好。
这几张大表中存储的是设备的工作时长数据,从业务情况来看,用户一般比较关注的就是最近一个月的工作时长,比较久远的数据几乎不会有很多的查看,这些较早的工时数据也不再会发生改变,所以考虑对历史数据进行归档。
进行数据归档,主表仅保留最近一个季度的数据,大概是720万左右的数据量,一个季度之前的数据归档到历史数据表中。
归档操作
1、创建一个和原表一样的历史数据表(索引都保留)
2、选择一个读库,写一个存储过程,分批查询数据写入历史数据表中,在晚上数据库相对空闲的时候执行
应用改造
做一个开关配置,对历史数据的查询可以实现切换,如果线上查询归档表出现问题,可以回滚到原表进行查询,原表的数据还是完整的。
按照时间条件分情况:
1、对一个季度之前的工时数据查询,切换到历史数据表做按月查询
2、对最近一个季度的查询,切换到原表查询
3、如果有跨原表和历史表的时间窗口,就需要做下处理,将两个表的查询结果合并返回
注意:查询必须带上时间窗口,因为后端是按照时间窗口来判断要从哪张表查询数据。
数据删除
当系统运行正常后,就需要对原表中的数据进行删除,对原表中的数据按照时间进行分批删除,直到删除完毕仅保留最近一个季度的数据。
当原表中的历史数据删除完成,为了释放存储空间和优化索引结构,因为系统可以接受暂时停服,所以直接新建一个临时表,然后把原表复制到临时表中,再把原表改名,最后把临时表的表名改成正式表。这样,相当于手工把订单表重建了一次。大概操作流程如下:
-- 新建一个临时表 create table cloud_box_workhour_temp like cloud_box_workhour; -- 把当前表复制到临时表中 insert into cloud_box_workhour_temp select * from cloud_box_workhour where timestamp >= SUBDATE(CURDATE(),INTERVAL 3 month); -- 修改替换表名 rename table cloud_box_workhour to cloud_box_workhour_to_be_droppd, cloud_box_workhour_temp to cloud_box_workhour; -- 删除旧表 drop table cloud_box_workhour_to_be_droppd
总结
大数据表的优化,处理思想就是一个“拆”字,要么拆一个新库,要么拆表。
如果并发量比较高,给整个业务数据库压力比较大,有可能会影响到所有的业务系统,这种情况一般选择拆分新库。
对于单表的大数据,优先选择归档历史数据,这种对应用代码的影响最小。其次考虑分表,分表需要按照实际的业务数据选择合适的分片策略,具体情况需要具体分析。
好了,本文到此结束,带大家了解了《大数据表优化(一):分库》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

- 上一篇
- 全备 + binlog 恢复线上数据

- 下一篇
- WoShop直播+短视频带货多商户直播商城系统源码APP小程序源码,前后端全开源无加密,放心商用
-
- 俊逸的钢笔
- 感谢大佬分享,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢楼主分享博文!
- 2023-03-12 01:53:09
-
- 冷傲的大炮
- 很详细,收藏了,感谢up主的这篇技术贴,我会继续支持!
- 2023-03-09 00:17:06
-
- 还单身的高跟鞋
- 这篇技术贴真是及时雨啊,好细啊,真优秀,已收藏,关注师傅了!希望师傅能多写数据库相关的文章。
- 2023-02-27 04:08:54
-
- 数据库 · MySQL | 1天前 |
- MySQL设置中文界面,超简单教程来了!
- 332浏览 收藏
-
- 数据库 · MySQL | 1天前 | mysql 索引提示
- MySQL进阶必看!FORCE/USE/IGNOREINDEX用法大揭秘
- 182浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- 手把手教你写MySQL存储过程,小白也能轻松上手
- 163浏览 收藏
-
- 数据库 · MySQL | 1天前 | mysql group by
- MySQL分组查询优化:GROUPBY原理+索引优化超全解析
- 324浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL设置中文语言,轻松拥有中文界面
- 211浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL建库语句从入门到精通:创建数据库+设置字符集&排序规则(附实例)
- 176浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- 从零开始学MySQL数据库操作,小白轻松变大神!
- 496浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL插入日期到时间字段,轻松搞定日期格式
- 484浏览 收藏
-
- 数据库 · MySQL | 1天前 | mysql 数据压缩
- MySQL怎么实现高效压缩存储?表压缩+列式存储详细解读
- 272浏览 收藏
-
- 数据库 · MySQL | 1天前 | mysql JOIN优化
- MySQL优化JOIN操作:七大技巧教你提升关联查询速度
- 106浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL出现中文乱码?超详细解决方案一次性搞定
- 211浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL主从复制这样配!搞懂这些参数,replication稳了~
- 131浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 14次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 48次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 56次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 51次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 56次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览