是否你也遇到了类似的问题:如何处理海量数据

比如订单数据越来越多(亿级),查询越来越慢,如何处理?
分库分表会带来哪些副作用?可能的解决方式有哪些?

问题

目前经常使用的关系型数据库如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

如果觉得内容赞,您可以请我喝杯咖啡:

        

【总结】亿级数据的访问和储存,实现和优化相关推荐

  1. oracle 亿级数据分页,oracle分页查询千万级优化-Oracle

    oracle分页查询千万级优化,在做比对项目时,有表是3千万多的数据,在页面做分页查询时很卡40s,反正差不多一分钟的时间,后来更了sql,优化了代码就好了很多,4s就可以了. 代码里优化是把总条数存 ...

  2. 京东物流基于Doris的亿级数据自助探索应用

    导读:京东智慧物流在数据应用方面,主要是基于大数据预测分析技术实现智能化的调度.决策,提升物流效率,最终提升客户的体验.但面对亿级数据的业务场景,将会面临着不同的问题和不同的处理方案.今天讨论了京东物 ...

  3. 唯品会翻牌ClickHouse后,实现百亿级数据自助分析

    本文根据王玉老师在[deeplus直播第266期]线上分享演讲内容整理而成.(文末有获取本期PPT&回放的方式,不要错过) 王玉 唯品会实时平台OLAP团队负责人 负责唯品会Presto.Cl ...

  4. DockOne微信分享( 九十一):打造百亿级数据处理量的弹性调度容器平台

    本文讲的是DockOne微信分享( 九十一):打造百亿级数据处理量的弹性调度容器平台[编者的话]本次分享介绍七牛数据处理团队的容器技术实践经验,分享七牛如何通过自主研发的容器调度框架打造易扩展.易部署 ...

  5. MySQL 亿级数据需求的优化思路(二),100亿数据,1万字段属性的秒级检索

    最近在研究亿级数据的时候,无意中看到了一个关于写58同城的文章 https://blog.csdn.net/admin1973/article/details/55251499?from=timeli ...

  6. 第三章 中间件,3.1 万亿级数据洪峰下的分布式消息引擎(作者:冯嘉、誓嘉、尘央、牟羽)...

    3.1 万亿级数据洪峰下的分布式消息引擎 前言 通过简单回顾阿里中间件(Aliware)消息引擎的发展史,本文开篇于双11消息引擎面临的低延迟挑战,通过经典的应用场景阐述可能会面临的问题 - 响应慢, ...

  7. mysql如何备份一个表单_Mysql亿级数据大表单表备份

    上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久.本篇将就如何备份亿级数据大表展开讨论. 注意:我这里所说的备份指的是数据从一 ...

  8. 1万条数据大概占多大空间_mysql亿级数据数据库优化方案测试-银行交易流水记录的查询...

    对MySQL的性能和亿级数据的处理方法思考,以及分库分表到底该如何做,在什么场景比较合适? 比如银行交易流水记录的查询 限盐少许,上实际实验过程,以下是在实验的过程中做一些操作,以及踩过的一些坑,我觉 ...

  9. 10亿级数据规模的半监督图像分类模型,Imagenet测试精度高达81.2% | 技术头条...

    译者 | linstancy 作者| I. Zeki Yanlniz, Herve Jegou, Kan Chen, Manohar Paluri, Dhruv Mahajan 编辑 | 蓝色琥珀鱼, ...

最新文章

  1. led透明屏生产厂家_LED透明屏与LED玻璃屏有何区别
  2. js实践篇:例外处理Try{}catch(e){}
  3. 443 k8s配置开启nginx_SSL证书不会安装配置?手把手教会你,3步搞定
  4. 初涉.....编码__列表__字典
  5. 二十七、 爬取Boss直聘的招聘信息
  6. redis根据通配符去批量删除指令
  7. Android自动伸展动画,android – 如何实现平滑的展开/折叠动画
  8. ListView列表刷新方法的区别
  9. 带你了解Python炫酷的颜色输出与进度条打印
  10. 嵌入式开发有年龄限制吗_报名深圳成考有年龄限制吗?
  11. mysql 自动递增值归零_修改MySQL自动递增值
  12. HoloLens 2开发:获取并渲染双手
  13. 优化C/C++代码的小技巧
  14. 关于互联网用户的隐私保护
  15. 如何在Total Commander中使用命令行
  16. 【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-01周边站点
  17. 移动端顶部状态栏显示及修改背景色
  18. sql2000密码查看方式
  19. PhotoshopCS6的功能介绍
  20. python | 统计频次

热门文章

  1. 大锅乱炖10大 H5 前端框架
  2. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java计算机学院课程设计管理系统75n4l
  3. 批量提取图片信息[大小、宽高尺寸和分辨率]
  4. 一名大三学生对软件工程的理解
  5. 百度、高德、腾讯、天地图、谷歌、必应等地图切图工具 MapCutter 3.7.1
  6. Debit Note 和 Credit Note
  7. 欧洲fba海运详解:欧洲fba海运怎么样?有哪些优势?
  8. 一起来学习打地鼠游戏
  9. QIML近期招聘一览表
  10. 高性能游戏专属蓝牙耳机盘点,百元级高音质优质蓝牙耳机