MySQL 分库分表,写得太好了!

article/2025/8/22 2:50:10

https://www.toutiao.com/a6603492496779510276/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1549497188&app=news_article&utm_source=mobile_qq&iid=59568063679&utm_medium=toutiao_android&group_id=6603492496779510276

Mysql分库分表方案

 

1.为什么要分表:

当一张表的数据达到几千万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

mysql中有一种机制是表锁定和行锁定,是为了保证数据的完整性。表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行。行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操作。

2. mysql proxy:amoeba

做mysql集群,利用amoeba。

从上层的java程序来讲,不需要知道主服务器和从服务器的来源,即主从数据库服务器对于上层来讲是透明的。可以通过amoeba来配置。

3.大数据量并且访问频繁的表,将其分为若干个表。

比如对于某网站平台的数据库表-公司表,数据量很大,这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。

 

某网站现在的数据量至多是5000万条,可以设计每张表容纳的数据量是500万条,也就是拆分成10张表。

那么如何判断某张表的数据是否容量已满呢?可以在程序段对于要新增数据的表,在插入前先做统计表记录数量的操作,当<500万条数据,就直接插入,当已经到达阀值,可以在程序段新创建数据库表(或者已经事先创建好),再执行插入操作。

4. 利用merge存储引擎来实现分表

如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了。用merge存储引擎来实现分表, 这种方法比较适合。

举例子:

MySQL 分库分表,写得太好了!

 

 

数据库架构

 

1、简单的MySQL主从复制:

MySQL的主从复制解决了数据库的读写分离,并很好的提升了读的性能,其图如下:

MySQL 分库分表,写得太好了!

 

 

其主从复制的过程如下图所示:

MySQL 分库分表,写得太好了!

 

 

但是,主从复制也带来其他一系列性能瓶颈问题:

  1. 写入无法扩展
  2. 写入无法缓存
  3. 复制延时
  4. 锁表率上升
  5. 表变大,缓存率下降

 

那问题产生总得解决的,这就产生下面的优化方案,一起来看看。

2、MySQL垂直分区

 

如果把业务切割得足够独立,那把不同业务的数据放到不同的数据库服务器将是一个不错的方案,而且万一其中一个业务崩溃了也不会影响其他业务的正常进行,并且也起到了负载分流的作用,大大提升了数据库的吞吐能力。经过垂直分区后的数据库架构图如下:

MySQL 分库分表,写得太好了!

 

 

然而,尽管业务之间已经足够独立了,但是有些业务之间或多或少总会有点联系,如用户,基本上都会和每个业务相关联,况且这种分区方式,也不能解决单张表数据量暴涨的问题,因此为何不试试水平分割呢?

3、MySQL水平分片(Sharding)

这是一个非常好的思路,将用户按一定规则(按id哈希)分组,并把该组用户的数据存储到一个数据库分片中,即一个sharding,这样随着用户数量的增加,只要简单地配置一台服务器即可,原理图如下:

MySQL 分库分表,写得太好了!

 

 

如何来确定某个用户所在的shard呢,可以建一张用户和shard对应的数据表,每次请求先从这张表找用户的shard id,再从对应shard中查询相关数据,如下图所示:

MySQL 分库分表,写得太好了!

 

 

单库单表

单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到。

单库多表

随着用户数量的增加,user表的数据量会越来越大,当数据量达到一定程度的时候对user表的查询会渐渐的变慢,从而影响整个DB的性能。如果使用mysql, 还有一个更严重的问题是,当需要添加一列的时候,mysql会锁表,期间所有的读写操作只能等待。

可以通过某种方式将user进行水平的切分,产生两个表结构完全一样的user_0000,user_0001等表,user_0000 + user_0001 + …的数据刚好是一份完整的数据。

多库多表

随着数据量增加也许单台DB的存储空间不够,随着查询量的增加单台数据库服务器已经没办法支撑。这个时候可以再对数据库进行水平区分。

分库分表规则

设计表的时候需要确定此表按照什么样的规则进行分库分表。例如,当有新用户时,程序得确定将此用户信息添加到哪个表中;同理,当登录的时候我们得通过用户的账号找到数据库中对应的记录,所有的这些都需要按照某一规则进行。

路由

通过分库分表规则查找到对应的表和库的过程。如分库分表的规则是user_id mod 4的方式,当用户新注册了一个账号,账号id的123,我们可以通过id mod 4的方式确定此账号应该保存到User_0003表中。当用户123登录的时候,我们通过123 mod 4后确定记录在User_0003中。

分库分表产生的问题,及注意事项

1.分库分表维度的问题

假如用户购买了商品,需要将交易记录保存取来,如果按照用户的纬度分表,则每个用户的交易记录都保存在同一表中,所以很快很方便的查找到某用户的 购买情况,但是某商品被购买的情况则很有可能分布在多张表中,查找起来比较麻烦。反之,按照商品维度分表,可以很方便的查找到此商品的购买情况,但要查找 到买人的交易记录比较麻烦。

所以常见的解决方式有:

  1. 通过扫表的方式解决,此方法基本不可能,效率太低了。
  2. 记录两份数据,一份按照用户纬度分表,一份按照商品维度分表。

 

通过搜索引擎解决,但如果实时性要求很高,又得关系到实时搜索。

2.联合查询的问题

联合查询基本不可能,因为关联的表有可能不在同一数据库中。

3.避免跨库事务

避免在一个事务中修改db0中的表的时候同时修改db1中的表,一个是操作起来更复杂,效率也会有一定影响。

4.尽量把同一组数据放到同一DB服务器上

例如将卖家a的商品和交易信息都放到db0中,当db1挂了的时候,卖家a相关的东西可以正常使用。也就是说避免数据库中的数据依赖另一数据库中的数据。

一主多备

在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在 Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂 Slave,通过此方式可以有效的提高DB集群的 QPS.

所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

此外,可以看出Master是集群的瓶颈,当写操作过多,会严重影响到Master的稳定性,如果Master挂掉,整个集群都将不能正常工作。

所以

1. 当读压力很大的时候,可以考虑添加Slave机器的分式解决,但是当Slave机器达到一定的数量就得考虑分库了。

2. 当写压力很大的时候,就必须得进行分库操作。

MySQL使用为什么要分库分表

 

可以用说用到MySQL的地方,只要数据量一大, 马上就会遇到一个问题,要分库分表。

这里引用一个问题为什么要分库分表呢?MySQL处理不了大的表吗?

其实是可以处理的大表的。我所经历的项目中单表物理上文件大小在80G多,单表记录数在5亿以上,而且这个表 属于一个非常核用的表:朋友关系表。

但这种方式可以说不是一个最佳方式。因为面临文件系统如Ext3文件系统对大于大文件处理上也有许多问题。

这个层面可以用xfs文件系统进行替换。但MySQL单表太大后有一个问题是不好解决: 表结构调整相关的操作基本不在可能。所以大项在使用中都会面监着分库分表的应用。

从Innodb本身来讲数据文件的Btree上只有两个锁, 叶子节点锁和子节点锁,可以想而知道,当发生页拆分或是添加新叶时都会造成表里不能写入数据。

所以分库分表还就是一个比较好的选择了。

那么分库分表多少合适呢?

经测试在单表1000万条记录一下,写入读取性能是比较好的. 这样在留点buffer,那么单表全是数据字型的保持在800万条记录以下, 有字符型的单表保持在500万以下。

如果按 100库100表来规划,如用户业务:

500万*100*100 = 50000000万 = 5000亿记录。

心里有一个数了,按业务做规划还是比较容易的。


http://chatgpt.dhexx.cn/article/Zi8vj4vt.shtml

相关文章

MySQL数据库怎么进行分库分表?

▲ 点击上方“分布式实验室”关注公众号 回复“1”抽取纸质技术书 提起分库分表&#xff0c;对于大部分服务器开发来说&#xff0c;其实并不是一个新鲜的名词。随着业务的发展&#xff0c;我们表中的数据量会变的越来越大&#xff0c;字段也可能随着业务复杂度的升高而逐渐增多…

超详细的mysql分库分表方案

我们都知道&#xff0c;随着业务量的增长&#xff0c;数据量也会随之增加&#xff0c;这个时候就需要关注业务大表&#xff0c;因为大表会影响查询性能&#xff0c;DDL变更时间很长&#xff0c;影响业务的可用性&#xff0c;同时导致从库延迟很大&#xff0c;如果业务做了读写分…

Mysql分库分表实战(一)——一文搞懂Mysql数据库分库分表

由于业务需要&#xff0c;需要对Mysql数据库进行分库分表&#xff0c;故而最近一直在整理分库分表的相关知识&#xff0c;现手上的工作也告一段落了&#xff0c;抽空将自己最近的学习结果转化为博文&#xff0c;分享给大家&#xff0c;本博文打算做成一个系列的&#xff0c;首先…

MySQL 常用分库分表方案,都在这里了!

点击上方关注 “终端研发部” 设为“星标”&#xff0c;和你一起掌握更多数据库知识 转自&#xff1a;尜尜人物 www.cnblogs.com/littlecharacter/p/9342129.htm 一、数据库瓶颈 不管是IO瓶颈&#xff0c;还是CPU瓶颈&#xff0c;最终都会导致数据库的活跃连接数增加&#xff0…

MySQL:互联网公司常用分库分表方案汇总

作者&#xff1a;尜尜人物 原文&#xff1a;cnblogs.com/littlecharacter/p/9342129.html 本文目录 一、数据库瓶颈 IO瓶颈CPU瓶颈 二、分库分表 水平分库水平分表垂直分库垂直分表 三、分库分表工具 四、分库分表步骤 五、分库分表问题 非partition key的查询问题非partition…

MySQL分库分表

1.分库分表产生的背景 采用单数据库存储存在以下的性能瓶颈&#xff1a; ①IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘IO&#xff0c;效率较低。请求数据太多&#xff0c;带宽不够&#xff0c;网络IO瓶颈。 ②CPU瓶颈&#xff1a;排…

MySQL-如何分库分表?一看就懂

一、为什么要分库分表 如果一个网站业务快速发展&#xff0c;那这个网站流量也会增加&#xff0c;数据的压力也会随之而来&#xff0c;比如电商系统来说双十一大促对订单数据压力很大&#xff0c;Tps十几万并发量&#xff0c;如果传统的架构&#xff08;一主多从&#xff09;&…

黑盒测试是用什么软件,黑盒测试的主要方法和常用的工具有什么?

黑盒测试是测试人员比较常用的一种测试方法&#xff0c;它主要是通过测试来检测每个功能是否都能正常使用的。黑盒测试的方法是有许多的&#xff0c;但有一些方法是比较主要的&#xff0c;比如边界值测试、等价类划分、决策表以及场景法等等。除了方法外&#xff0c;黑盒测试工…

黑盒测试简介和常用方法

黑盒测试简介和常用方法 定义 黑盒测试俗称功能测试&#xff0c;它站在用户的角度上主要是对系统或软件的界面、功能上进行测试。它把程序当成不能打开的盒子&#xff0c;这样不用考虑系统内部的逻辑和内部特性&#xff0c;只需要在程序的外部接口上检查程序是否能按照软件设计…

黑盒测试的测试方法

一般我们在做软件测试的时候,会遇到黑盒测试,白盒测试,我们今天主要说的是黑盒测试的 主要测试方法有那些。接下来就是干货了。 最常见的是 边界值 等价类 错误推测法 场景法 因果图法 判定表组成法 正交实验设计 下面是详细的解释: 前言:在期末考到来的时候复习…

黑盒测试方法一

黑盒测试是一种基于证明功能需求和用户最终需求的测试方法&#xff0c;设计黑盒测试用例的方法有如下8种&#xff1a; 等价类划分法。 边界值分析法。 因果图法。 判定表驱动测试。 场景法。 功能图法。 错误推测法。 正交试验设计法。 在实际测试工作中&#xff0c;往往是综合…

软件测试方法——黑盒测试九大用例设计方法

笔者&#xff1a;风起怨江南 出处&#xff1a;https://blog.csdn.net/JackMengJin 笔者原创&#xff0c;文章转载需注明&#xff0c;如果喜欢请点赞关注&#xff0c;感谢支持&#xff01; 导读&#xff1a;面试和工作必备的九大黑盒软件测试方法。 目录 黑盒测试九大用例设计…

黑盒测试简介与其测试方法

黑盒测试又叫功能测试、数据驱动测试或基于需求规格说明书的功能测试。该类测试注重于测试软件的功能性需求。把测试对象看作一个黑盒子&#xff0c;完全不考虑程序内部的逻辑结构和内部特性&#xff0c;只依据程序的《需求规格说明书》&#xff0c;检查程序的功能是否符合它的…

简述软件黑盒测试的方法,简述什么是黑盒测试方法

黑盒(又叫功能测试、数据驱动测试)&#xff1a; 1.黑盒测试发现错误类型&#xff1a; 功能错误和遗漏 界面错误 数据库错误 性能错误 初始化和终止错误 2.黑盒测试&#xff1a;程序外部接口进行的 3.黑盒测试就是根据功能需求来设计测试用例&#xff0c;验证软件是否按照预期要…

黑盒(功能)测试基本方法

1、黑盒测试的概念 1、什么是黑盒测试 &#xff08;1&#xff09;黑盒测试又称功能测试、数据驱动测试或基于规格说明书的测试&#xff0c;是一种从用户观点出发的测试。 &#xff08;2&#xff09;测试人员把被测程序当作一个黑盒子。 2、黑盒测试主要测试的错误类型有 &…

黑盒测试方法详细介绍

一、等价类 1.关于等价类 2.等价类思想设计测试用例的步骤 二、边界值 1.关于边界点 2.使用边界值分析法设计测试用例步骤 三、因果图 1.关于因果图 2.关于判定表 3.使用因果图设计测试用例的步骤 1.分析所有可能的输入和可能的输出。 2.找出输入和输出之间的对应关系…

八大黑盒测试方法总结【超详细】

一、等价类划分法1.定义2. 划分等价类2.1 有效等价类2.2 无效等价类 3. 划分等价类的标准4.划分等价类的方法5.设计测试用例6. 三角形实例 二、边界值分析法1. 定义2. 与等价划分的区别3.边界值分析方法的考虑4. 常见的边界值5.边界值分析6.基于边界值分析方法选择测试用例的原…

软件测试常用的黑盒测试方法有哪些,简述什么是黑盒测试方法(最常用的黑盒测试方法)...

黑盒(又叫功能测试、数据驱动测试)&#xff1a; 1.黑盒测试发现错误类型&#xff1a; 功能错误和遗漏 界面错误 数据库错误 性能错误 初始化和终止错误 2.黑盒测试&#xff1a;程序外部接口进行的 3.黑盒测试就是根据功能需求来设计测试用例&#xff0c;验证软件是否按照预期要…

什么是黑盒测试?它的常用方法有哪些?

什么是黑盒测试&#xff1f;它的常用方法有哪些&#xff1f; 一&#xff1a;什么是黑盒测试&#xff1f; 黑盒测试&#xff08;Black-box Testing&#xff09;&#xff0c;黑盒测试又称为“功能测试”&#xff0c;是将测试对象看做一个黑盒&#xff0c;在并不考虑软件产品的内…

黑盒测试方法

什么是黑盒测试 黑盒测试又称功能测试&#xff0c;是在不了解程序内部结构和内部特性的情况下进行的测试方法&#xff0c;黑盒测试只验证程序是否能按照需求规格说明书的规定正常使用&#xff0c;是否能适当的接收数据并给出适当的输出结果&#xff0c;如错误提示&#xff0c;或…