【总结】亿级数据的访问和储存,实现和优化
是否你也遇到了类似的问题:如何处理海量数据
比如订单数据越来越多(亿级),查询越来越慢,如何处理?
分库分表会带来哪些副作用?可能的解决方式有哪些?
问题
目前经常使用的关系型数据库如MySQL、SQL Server等,都是以“行”为单位进行存储,为了快速检索,也都采用了B树或其他索引技术。
从原理上来讲,表中的数据越多,索引树的范围越大,磁盘读取也越多,性能也就越低。
实践
从实践角度来看,一般以百万到千万作为一个表的存储量级,超出该范围之后,性能就会下降,需要采用其他技术手段解决。
首先想到的就是能否将读和写分离,主数据库用于写入,读数据库(多个)用于对外提供查询,通过数据复制的方式将主数据库的数据同步到读库。该架构提升了数据库的读写能力,但对于主数据库的写入能力依然没法扩展。
其次,依据数据库分区的思路,可以将不同的数据分散到不同的库中,每个库存储的数据都不同。
这样就可以将单一库的压力分散到多个库中,从而提升整个数据库的服务能力,这就是所说的分库分表技术。
针对分库分表的技术方案,目前我们自己采用了自研的技术解决方案,然而你也可以使用Sharding-JDBC方案。
若按照“字段(列)”分区,每个库/表存储不同的的字段,即schema不同,就是“垂直拆分”;
若按“数据记录(行)”分区,每个库/表的schema一致,但存储的数据不同,就是“水平拆分”。
垂直拆分
水平拆分
这样做的好处就是解决了数据存储容量的问题,但也带来了诸多弊端。
解决方案
这里以“水平拆分”为例来分析。
1.如何能做到数据的平均拆分,防止某一库压力过大?
系统开发者要结合业务特点来确定分库分表键,比如以userID为分库分表键,采用hash取模的方式将数据散列到不同的库中。
但并不是所有场景都适合用userID作为分库分表键的,若存在“大卖家”,则该userID可能有很多条记录,若简单的按照上述方法进行拆分,则可能打爆其中一个数据库。
一般来说,会将一段时间以前的数据归档(比如某个userID三个月之前的数据),存放到类似HBase这种非关系型数据库中,以此来解决上述问题。
2.分库分表之后就要求每个查询的where子句中必须携带分库分表键,但并非每个查询都能携带分库分表键的。
比如订单库按照订单号hash取模之后存储,此时分库分表键为订单号,那么想查询某位买家所有的订单,查询时就没有了分库分表键,就会出现“全表扫描”的情况。
一般在实践中解决这种问题的方法是建立“异构索引表”,即采用异步机制将原表内的每次一创建或更新,都换一个维度保存一份完整的数据表或索引表,拿空间换时间。
在上面说到,订单库按照订单号hash取模之后存储,同时也按照userID维度进行hash取模,再存储一份数据,那么想要获取某一userID的全部订单时,就将userID作为分库分表键传进去即可,避免了全表扫描。
上面这些是在海量数据处理过程中出现问题的解决思路,技术的突破需要依赖业务场景的需求和自身刻意的规划学习,二者缺一不可。
------------------------------------------------------
------------------------------------------------------
关于我(个人域名)
我的开源项目集Github
期望和大家一起学习,共同进步,共勉,O(∩_∩)O谢谢
欢迎交流问题,可加个人QQ 469580884,
或者,加我的群号 751925591,一起探讨交流问题
不讲虚的,只做实干家
Talk is cheap,show me the code
如果觉得内容赞,您可以请我喝杯咖啡:
【总结】亿级数据的访问和储存,实现和优化相关推荐
- oracle 亿级数据分页,oracle分页查询千万级优化-Oracle
oracle分页查询千万级优化,在做比对项目时,有表是3千万多的数据,在页面做分页查询时很卡40s,反正差不多一分钟的时间,后来更了sql,优化了代码就好了很多,4s就可以了. 代码里优化是把总条数存 ...
- 京东物流基于Doris的亿级数据自助探索应用
导读:京东智慧物流在数据应用方面,主要是基于大数据预测分析技术实现智能化的调度.决策,提升物流效率,最终提升客户的体验.但面对亿级数据的业务场景,将会面临着不同的问题和不同的处理方案.今天讨论了京东物 ...
- 唯品会翻牌ClickHouse后,实现百亿级数据自助分析
本文根据王玉老师在[deeplus直播第266期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的方式,不要错过) 王玉 唯品会实时平台OLAP团队负责人 负责唯品会Presto.Cl ...
- DockOne微信分享( 九十一):打造百亿级数据处理量的弹性调度容器平台
本文讲的是DockOne微信分享( 九十一):打造百亿级数据处理量的弹性调度容器平台[编者的话]本次分享介绍七牛数据处理团队的容器技术实践经验,分享七牛如何通过自主研发的容器调度框架打造易扩展.易部署 ...
- MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索
最近在研究亿级数据的时候,无意中看到了一个关于写58同城的文章 https://blog.csdn.net/admin1973/article/details/55251499?from=timeli ...
- 第三章 中间件,3.1 万亿级数据洪峰下的分布式消息引擎(作者:冯嘉、誓嘉、尘央、牟羽)...
3.1 万亿级数据洪峰下的分布式消息引擎 前言 通过简单回顾阿里中间件(Aliware)消息引擎的发展史,本文开篇于双11消息引擎面临的低延迟挑战,通过经典的应用场景阐述可能会面临的问题 - 响应慢, ...
- mysql如何备份一个表单_Mysql亿级数据大表单表备份
上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久.本篇将就如何备份亿级数据大表展开讨论. 注意:我这里所说的备份指的是数据从一 ...
- 1万条数据大概占多大空间_mysql亿级数据数据库优化方案测试-银行交易流水记录的查询...
对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以下是在实验的过程中做一些操作,以及踩过的一些坑,我觉 ...
- 10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...
译者 | linstancy 作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan 编辑 | 蓝色琥珀鱼, ...
最新文章
- led透明屏生产厂家_LED透明屏与LED玻璃屏有何区别
- js实践篇:例外处理Try{}catch(e){}
- 443 k8s配置开启nginx_SSL证书不会安装配置?手把手教会你,3步搞定
- 初涉.....编码__列表__字典
- 二十七、 爬取Boss直聘的招聘信息
- redis根据通配符去批量删除指令
- Android自动伸展动画,android – 如何实现平滑的展开/折叠动画
- ListView列表刷新方法的区别
- 带你了解Python炫酷的颜色输出与进度条打印
- 嵌入式开发有年龄限制吗_报名深圳成考有年龄限制吗?
- mysql 自动递增值归零_修改MySQL自动递增值
- HoloLens 2开发:获取并渲染双手
- 优化C/C++代码的小技巧
- 关于互联网用户的隐私保护
- 如何在Total Commander中使用命令行
- 【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-01周边站点
- 移动端顶部状态栏显示及修改背景色
- sql2000密码查看方式
- PhotoshopCS6的功能介绍
- python | 统计频次