分库分表:存量1亿,日增量500万如何分库分表?

简介: 分库分表:存量1亿,日增量500万如何分库分表?

分库分表


我们经常把分库分表放在一起说,理论上其实分库和分表达到的效果是相同的,分库分表是为了减轻数据库压力,提高效率。


现代业务越来越复杂,数据量也越来越大,关系型数据库本身就比较容易形成系统瓶颈,单机存储容量,连接数,处理能力都有限。同理单库,单表的处理能力更加有限,所以分库分表中心思想都是将数据分散,使得单一数据库/表的数据量变小来缓解单一数据库的性能问题,从而达到提升数据库性能的目的。


垂直分表/分库


垂直分表定义:将一个表按照字段分为多表,每个表里面都存储其中一部分字段。


垂直分库定义:专库专用,按照业务将表进行分类,分布在不同的数据库中,每个库可以放在不同的服务器上


从描述上直接理解,其实就是把一张表,从上往下切开,把不同的字段分布到不同的表里,因为从业务上,可以区分热点字段和非热点字段,可以依照这个来分。


意义


解决了热点数据的效率问题,分页等操作方便,但是对于大数据量无效。


水平分表分库


水平分表定义:同一个数据库内,对数据行拆分,不影响表结构。


水平分库定义:同一个表的数据按一定规则拆到不同的数据库中,库放在不同的服务器上。


从描述上直接理解,就是把一张表,从左到右切开,分完之后的表字段仍旧相同,但是数据内容是不同的,所有这些水平分表之后的表数据加在一起,才是完整的一份数据。


意义


解决了单库/单表的存储量和性能问题,但是对于一些查询操作增加了难度,对分页也有影响。


实例


假设这样一种情况,有一个订单表,目前有1亿数据,日增量为500万,我们的常用查询为,根据订单id查某条数据,或者根据用户id查用户的订单数据,我们应该如何进行分库分表操作呢?


分析


单表500w - 800w 数据,2G数据; 单库100G, 1w QPS , 5k TPS



这里我们假设该表有10个字段,每个字段100字节,一条数据共1000个字节。


1KB x 1亿约为100G左右。


假设我们本次进行分库分表,想要解决3年内的数据增长,也就是


365天 x 3年 x 500万 x 1KB 数据,约为5221G数据,55亿条左右。


首先我们先明确几个数据,目前我们常用的数据库服务器,按照8G内存来算,每个表大概存800万数据。55亿/800万约为688张表,按照700张表来算。


那么每个库里多少张表呢?这个涉及到qps,可以根据qps来计算一下。这里就不举例了。


计算方法大概就是上面这样


方案


也就是说,我们要进行水平分库分表,有两种方案,一种是按照用户hash,某个用户的所有订单数据都存到一个表里,另一种是按照订单id来hash,这样便于直接通过订单id来查询数据。


第一种


按照用户id来hash进行分表,当我们想要查询某个用户的所有订单,是很方便定位的,但是此时如果我们想通过某个订单id来查,会发现无从查起,所以我们需要另一张用户和订单的关联表(这个表也可以是分库分表的)来进行订单id的辅助查询。


第二种


按照订单id来hash进行分表,当我们使用某个订单id来查询时,很方便定位,但是查用户的订单会很麻烦,从我们表的数量来说,所有表都查一遍不太现实,所以也需要另一张用户和订单的关联表(这个表也可以是分库分表的)来进行用户订单的辅助查询。


其他


另外,需要注意的是,随着时间的流逝,我们可能没有必要把所有数据都存到mysql里,毕竟它不是分析型的数据库,我们可以根据时间,把老的数据放到一些其他适合查询场景的库里,比如淘宝使用的是X-Engine引擎的PolarDB-X集群(虽然我也没研究这是个啥呢)。


以上


不过实际上我也没见过这么多数据,我好没经验,有经验的大佬希望可以评论里分享下实际业务里都咋分,谢谢。


参考


轻松理解分库分表,大佬把分库分表讲解得通俗易懂


终于有大佬把分库分表的最佳实践讲清楚了


订单表的分库分表方案设计(大数据)


淘宝万亿级交易订单背后的存储引擎


我说MySQL每张表最好不超过2000万数据,面试官让我回去等通知?

相关文章
|
存储 SQL Cloud Native
深入了解云原生数据库CockroachDB的概念与实践
作为一种全球领先的分布式SQL数据库,CockroachDB以其高可用性、强一致性和灵活性等特点备受关注。本文将深入探讨CockroachDB的概念、设计思想以及实践应用,并结合实例演示其在云原生环境下的优越表现。
tesseract is not installed or it‘s not in your PATH解决办法!
简介:当我们想使用 pytesseract库的时候,我们开心的使用 pip install pytesseract安装完成后,却发现它并不能识别出图片内容,并且会抛出异常: pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it’s not in your PATH. See README file for more information.
tesseract is not installed or it‘s not in your PATH解决办法!
|
存储 NoSQL Redis
redis set底层数据结构
set底层存储  redis的集合对象set的底层存储结构特别神奇,我估计一般人想象不到,底层使用了intset和hashtable两种数据结构存储的,intset我们可以理解为数组,hashtable就是普通的哈希表(key为set的值,value为null)。
6910 0
|
11月前
|
项目管理 数据库 计算机视觉
2025年跨年目标如何高效实现?5款协同工具帮你与团队一起达成目标
随着2025年的到来,人们纷纷制定新目标,但真正挑战在于如何有效执行。为此,协同工具如板栗看板、Asana、Monday.com、Notion和ClickUp等,通过任务管理、进度跟踪、团队协作及自动化流程等功能,成为提升个人和团队执行力的关键。这些工具不仅帮助明确目标、分解任务,还优化了团队合作,确保每个细节都得到妥善处理,助力目标实现。
2025年跨年目标如何高效实现?5款协同工具帮你与团队一起达成目标
|
机器学习/深度学习 自然语言处理 数据可视化
文本挖掘与可视化:生成个性化词云的Python实践【7个案例】
词云(Word Cloud),又称为文字云或标签云,是一种用于文本数据可视化的技术,通过不同大小、颜色和字体展示文本中单词的出现频率或重要性。在词云中,更频繁出现的单词会显示得更大,反之则更小。
|
缓存 NoSQL Java
面试官:Redis如何实现延迟任务?
延迟任务是计划任务,用于在未来特定时间执行。常见应用场景包括定时通知、异步处理、缓存管理、计划任务、订单处理、重试机制、提醒和数据采集。Redis虽无内置延迟任务功能,但可通过过期键通知、ZSet或Redisson实现。然而,这种方法精度有限,稳定性较差,适合轻量级需求。Redisson的RDelayedQueue提供更简单的延迟队列实现。
709 9
|
负载均衡 Java Nacos
Springboot集成openFeign实现服务调用
Springboot集成openFeign实现服务调用
1373 0
|
存储 数据库连接 数据库
数据量大了,就一定要分库分表吗?
有位小伙伴在阿里的面试中,被问到,说只要数据量大了,就一定要分库分表吗?如果你直接回答,是 的话,这大概率就会被 了。
624 0
|
SQL 缓存 算法
MySQL关联查询Join的原理和优化
MySQL关联查询Join的原理和优化
1269 1
MySQL关联查询Join的原理和优化
|
存储 缓存 Java
(万字总结)spring事务失效的12种场景, 实在太坑了
为了保障操作的原子性, 避免数据不一样的情况,我们一般都会用到spring事务.但spring事务失效的12种场景, 实在太坑了
776 0