Mysql分库分表方案

article/2025/8/22 1:42:49

相关文章:

1、 使用Spring AOP实现MySQL数据库读写分离案例分析

2、MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解

3、MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结

4、使用mysqlreplicate命令快速搭建 Mysql 主从复制

5、大型网站应用之海量数据和高并发解决方案总结一二

一、MySQL扩展具体的实现方式

随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。

关于数据库的扩展主要包括:业务拆分、主从复制,数据库分库与分表。这篇文章主要讲述数据库分库与分表

(1)业务拆分

在 大型网站应用之海量数据和高并发解决方案总结一二 一篇文章中也具体讲述了为什么要对业务进行拆分。

业务起步初始,为了加快应用上线和快速迭代,很多应用都采用集中式的架构。随着业务系统的扩大,系统变得越来越复杂,越来越难以维护,开发效率变得越来越低,并且对资源的消耗也变得越来越大,通过硬件提高系统性能的方式带来的成本也越来越高。

因此,在选型初期,一个优良的架构设计是后期系统进行扩展的重要保障。

例如:电商平台,包含了用户、商品、评价、订单等几大模块,最简单的做法就是在一个数据库中分别创建users、shops、comment、order四张表。

这里写图片描述

但是,随着业务规模的增大,访问量的增大,我们不得不对业务进行拆分。每一个模块都使用单独的数据库来进行存储,不同的业务访问不同的数据库,将原本对一个数据库的依赖拆分为对4个数据库的依赖,这样的话就变成了4个数据库同时承担压力,系统的吞吐量自然就提高了。

这里写图片描述

(2)主从复制

1、MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解

2、MySQL主从复制的常见拓扑、原理分析以及如何提高主从复制的效率总结

3、使用mysqlreplicate命令快速搭建 Mysql 主从复制

上述三篇文章中,讲述了如何配置主从数据库,以及如何实现数据库的读写分离,这里不再赘述,有需要的选择性点击查看。

这里写图片描述

上图是网上的一张关于MySQL的Master和Slave之间数据同步的过程图。

主要讲述了MySQL主从复制的原理:数据复制的实际就是Slave从Master获取Binary log文件,然后再本地镜像的执行日志中记录的操作。由于主从复制的过程是异步的,因此Slave和Master之间的数据有可能存在延迟的现象,此时只能保证数据最终的一致性。

(3)数据库分库与分表

我们知道每台机器无论配置多么好它都有自身的物理上限,所以当我们应用已经能触及或远远超出单台机器的某个上限的时候,我们惟有寻找别的机器的帮助或者继续升级的我们的硬件,但常见的方案还是通过添加更多的机器来共同承担压力。

我们还得考虑当我们的业务逻辑不断增长,我们的机器能不能通过线性增长就能满足需求?因此,使用数据库的分库分表,能够立竿见影的提升系统的性能,关于为什么要使用数据库的分库分表的其他原因这里不再赘述,主要讲具体的实现策略。请看下边章节。

二、分表实现策略

关键字:用户ID、表容量

对于大部分数据库的设计和业务的操作基本都与用户的ID相关,因此使用用户ID是最常用的分库的路由策略。用户的ID可以作为贯穿整个系统用的重要字段。因此,使用用户的ID我们不仅可以方便我们的查询,还可以将数据平均的分配到不同的数据库中。(当然,还可以根据类别等进行分表操作,分表的路由策略还有很多方式)

接着上述电商平台假设,订单表order存放用户的订单数据,sql脚本如下(只是为了演示,省略部分细节):

CREATE TABLE `order` (`order_id` bigint(32) primary key auto_increment,`user_id` bigint(32),...
) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

当数据比较大的时候,对数据进行分表操作,首先要确定需要将数据平均分配到多少张表中,也就是:表容量

这里假设有100张表进行存储,则我们在进行存储数据的时候,首先对用户ID进行取模操作,根据 user_id%100 获取对应的表进行存储查询操作,示意图如下:

这里写图片描述

例如,user_id = 101 那么,我们在获取值的时候的操作,可以通过下边的sql语句:

select * from order_1 where user_id= 101
  • 1
  • 1

其中,order_1是根据 101%100 计算所得,表示分表之后的第一章order表。

注意:

在实际的开发中,如果你使用MyBatis做持久层的话,MyBatis已经提供了很好得支持数据库分表的功能,例如上述sql用MyBatis实现的话应该是:

接口定义:


/*** 获取用户相关的订单详细信息* @param tableNum 具体某一个表的编号* @param userId 用户ID* @return 订单列表*/
public List<Order> getOrder(@Param("tableNum") int tableNum,@Param("userId") int userId);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

xml配置映射文件:

<select id="getOrder" resultMap="BaseResultMap">select * from order_${tableNum}where user_id = #{userId}</select>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

其中${tableNum} 含义是直接让参数加入到sql中,这是MyBatis支持的特性。

注意:

另外,在实际的开发中,我们的用户ID更多的可能是通过UUID生成的,这样的话,我们可以首先将UUID进行hash获取到整数值,然后在进行取模操作。
  • 1
  • 1

三、分库实现策略

数据库分表能够解决单表数据量很大的时候数据查询的效率问题,但是无法给数据库的并发操作带来效率上的提高,因为分表的实质还是在一个数据库上进行的操作,很容易受数据库IO性能的限制。

因此,如何将数据库IO性能的问题平均分配出来,很显然将数据进行分库操作可以很好地解决单台数据库的性能问题。

分库策略与分表策略的实现很相似,最简单的都是可以通过取模的方式进行路由。

还是上例,将用户ID进行取模操作,这样的话获取到具体的某一个数据库,同样关键字有:

用户ID、库容量

路由的示意图如下:

这里写图片描述

上图中库容量为100。

同样,如果用户ID为UUID请先hash然后在进行取模。

四、分库与分表实现策略

上述的配置中,数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。

有时候,我们需要同时考虑这两个问题,因此,我们既需要对单表进行分表操作,还需要进行分库操作,以便同时扩展系统的并发处理能力和提升单表的查询性能,就是我们使用到的分库分表。

分库分表的策略相对于前边两种复杂一些,一种常见的路由策略如下:

1、中间变量 = user_id%(库数量*每个库的表数量);
2、库序号 = 取整(中间变量/每个库的表数量);
3、表序号 = 中间变量%每个库的表数量;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

例如:数据库有256 个,每一个库中有1024个数据表,用户的user_id=262145,按照上述的路由策略,可得:

1、中间变量 = 262145%(256*1024)= 1;
2、库序号 = 取整(1/1024)= 0;
3、表序号 = 1%1024 = 1;
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

这样的话,对于user_id=262145,将被路由到第0个数据库的第1个表中。

示意图如下:

这里写图片描述

五、分库分表总结

关于分库分表策略的选择有很多种,上文中根据用户ID应该是比较简单的一种。其他方式比如使用号段进行分区或者直接使用hash进行路由等。有兴趣的可以自行查找学习。

关于上文中提到的,如果用户的ID是通过UUID的方式生成的话,我们需要单独的进行一次hash操作,然后在进行取模操作等,其实hash本身就是一种分库分表的策略,使用hash进行路由策略的时候,我们需要知道的是,也就是hash路由策略的优缺点,优点是:数据分布均匀;缺点是:数据迁移的时候麻烦,不能按照机器性能分摊数据。

上述的分库和分表操作,查询性能和并发能力都得到了提高,但是还有一些需要注意的就是,例如:原本跨表的事物变成了分布式事物;由于记录被切分到不同的数据库和不同的数据表中,难以进行多表关联查询,并且不能不指定路由字段对数据进行查询。分库分表之后,如果我们需要对系统进行进一步的扩阵容(路由策略变更),将变得非常不方便,需要我们重新进行数据迁移。


最后需要指出的是,分库分表目前有很多的中间件可供选择,最常见的是使用淘宝的中间件Cobar。

GitHub地址:https://github.com/alibaba/cobara

文档地址为:https://github.com/alibaba/cobar/wiki

关于淘宝的中间件Cobar本篇内容不具体介绍,会在后边的学习中在做介绍。

另外spring也可以实现数据库的读写分离操作,后边的文章,会进一步学习。

六、总结

上述中,我们学到了如何进行数据库的读写分离和分库分表,那么,是不是可以实现一个可扩展、高性能、高并发的网站那?很显然还不可以!一个大型的网站使用到的技术远不止这些,可以说,这些都是其中的最基础的一个环节,因为还有很多具体的细节我们没有掌握到,比如:数据库的集群控制,集群的负载均衡,灾难恢复,故障自动切换,事务管理等等技术。因此,还有很多需要去学习去研究的地方。

总之:

路漫漫其修远兮,吾将上下而求索。


http://chatgpt.dhexx.cn/article/0458T8jw.shtml

相关文章

mysql-分库分表

1、为什么要分库分表 1、为什么要分库分表 出现数据库瓶颈&#xff0c;比如IO瓶颈&#xff0c;CPU瓶颈 1、IO瓶颈 &#xff08;1&#xff09;磁盘读IO瓶颈- 数据体积比较大&#xff1a;大量的写操作&#xff0c;磁盘IO读写必然慢&#xff0c;效率低大量的读操作&#xff0c;…

mysql分库分表(一)

微信搜索&#xff1a;“二十同学” 公众号&#xff0c;欢迎关注一条不一样的成长之路 数据库分库分表策略的具体实现方案 相关文章&#xff1a; 1、 使用Spring AOP实现MySQL数据库读写分离案例分析 2、MySQL5.6 数据库主从&#xff08;Master/Slave&#xff09;同步安装与…

【MySQL】MySQL分库分表详解

目录 一、前言 1.1 数据量 1.2 磁盘 1.3 数据库连接 二、垂直拆分 or 水平拆分&#xff1f; 三、垂直拆分 3.1 垂直分库 3.2 垂直分表 3.3 垂直拆分的优缺点 四、水平拆分 4.1 水平分表 4.2 水平分库分表 4.3 水平拆分的优缺点 五、几种常用的分库分表的策略 5.1 根据数值范围 …

MySQL 分库分表

MySQL分库分表 概念 读写分离优化了互联网读多写少场景下的性能问题&#xff0c;考虑一个业务场景&#xff0c;如果读库的数据规模非常大&#xff0c;除了增加多个从库之外&#xff0c;还有其他的手段吗&#xff1f;实现数据库高可用&#xff0c;还有另外一个撒手锏&#xff…

MySQL之分库分表

为什么要分库分表 用户请求量太大 单服务器TPS、内存、IO都是有上限的&#xff0c;需要将请求打散分布到多个服务器 单库数据量太大 单库处理能力有限&#xff1b;单库所在服务器的磁盘空间有限&#xff1b;单库的操作IO有瓶颈 单表数据量太大 查询、插入、更新操作都会变慢&am…

【Mysql】分库分表

【Mysql】分库分表 文章目录 【Mysql】分库分表1. 介绍2. 拆分策略2.1 垂直拆分2.1.1 垂直分库2.1.2 垂直分表 2.2 水平拆分2.2.1 水平分库2.2.2 水平分表 1. 介绍 采用单数据库进行数据存储存在以下瓶颈&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不…

一文搞懂MySQL数据库分库分表

如果数据量过大&#xff0c;大家一般会分库分表。分库需要注意的内容比较少&#xff0c;但分表需要注意的内容就多了。 工作这几年没遇过数据量特别大的业务&#xff0c;那些过亿的数据&#xff0c;因为索引设置合理&#xff0c;单表性能没有影响&#xff0c;所以实战中一直没…

Mysql·分库分表

Mysql分库分表 在mysql中新建数据库用以表分库分表mycat解压后配置文件参数server.xml 主要配置mycat服务的参数&#xff0c;比如端口号&#xff0c;myact用户名和密码使用的逻辑数据库等rule.xml 主要配置路由策略&#xff0c;主要有分片的片键&#xff0c;拆分的策略&#xf…

MySQL分库分表,何时分?怎么分?

&#x1f468;‍&#x1f393; 博主介绍&#xff1a; IT邦德&#xff0c;江湖人称jeames007&#xff0c;10年DBA工作经验 中国DBA联盟(ACDU)成员&#xff0c;目前从事DBA及程序编程 &#xff08;Web\java\Python&#xff09;工作&#xff0c;主要服务于生产制造 现拥有 Oracle …

MySQL 分库分表实践

文章目录 一、为什么要分库分表二、库表太大产生的问题三、垂直拆分1. 垂直分库2. 垂直分表 四、水平分表1. 配置水平分表2. 测试水平分表 一、为什么要分库分表 数据库架构演变 刚开始多数项目用单机数据库就够了&#xff0c;随着服务器流量越来越大&#xff0c;面对的请求也…

MySQL如何分库分表

1. 我们为什么需要分库分表 在分库分表之前&#xff0c;就需要考虑为什么需要拆分。我们做一件事&#xff0c;肯定是有充分理由的。所以得想好分库分表的理由是什么。我们现在就从两个维度去思考它&#xff0c;为什么要分库&#xff1f;为什么要分表&#xff1f; 1.1 为什么要…

MYSQL 之 分库分表

分库分表 关系型数据库本身⽐较容易成为系统瓶颈&#xff0c;单机存储容量、连接数、处理能⼒都有限。当单表的数据量 达到2000W或100G以后&#xff0c;由于查询维度较多&#xff0c;即使添加从库、优化索引&#xff0c;做很多操作时性能仍下降严 重。此时就要考虑对其进⾏切分…

MySQL-分库分表详解(一)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

如何实现MYSQL分库分表

我们学习了在高并发下数据库的一种优化方案&#xff1a;读写分离&#xff0c;它就是依靠主从复制的技术使得数据库实现了数据复制为多份&#xff0c;增强了抵抗大量并发读请求的能力&#xff0c;提升了数据库的查询性能的同时&#xff0c;也提升了数据的安全性。当某一个数据库…

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

https://www.toutiao.com/a6603492496779510276/?tt_frommobile_qq&utm_campaignclient_share&timestamp1549497188&appnews_article&utm_sourcemobile_qq&iid59568063679&utm_mediumtoutiao_android&group_id6603492496779510276 Mysql分库分表…

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…