最全的MySQL分库分表方案总结

article/2025/4/24 9:40:24

面试中我们经常会碰到的关于分库分表的问题!今天就给大家介绍互联网公司常用 MySQL 分库分表方案!希望对大家的面试有所帮助!

数据库瓶颈

不管是 IO 瓶颈,还是 CPU 瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。

在业务 Service 来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。

IO 瓶颈

第一种:磁盘读 IO 瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的 IO,降低查询速度→分库和垂直分表。

第二种:网络 IO 瓶颈,请求的数据太多,网络带宽不够→分库。

CPU 瓶颈

第一种:SQL 问题,如 SQL 中包含 join,group by,order by,非索引字段条件查询等,增加 CPU 运算的操作→SQL 优化,建立合适的索引,在业务 Service 层进行业务计算。

第二种:单表数据量太大,查询时扫描的行太多,SQL 效率低,CPU 率先出现瓶颈→水平分表。


分库分表

水平分库

水平分库,如下图:

概念:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。

结果:

  • 每个库的结构都一样

  • 每个库的数据都不一样,没有交集

  • 所有库的并集是全量数据

场景:系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。

分析:库多了,IO 和 CPU 的压力自然可以成倍缓解。

水平分表

水平分表,如下图:

概念:以字段为依据,按照一定策略(hash、range 等),将一个表中的数据拆分到多个表中。

结果:

  • 每个表的结构都一样

  • 每个表的数据都不一样,没有交集

  • 所有表的并集是全量数据

场景:系统绝对并发量并没有上来,只是单表的数据量太多,影响了 SQL 效率,加重了 CPU 负担,以至于成为瓶颈。

分析:表的数据量少了,单次 SQL 执行效率高,自然减轻了 CPU 的负担。

垂直分库

垂直分库,如下图:

概念:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

结果:

  • 每个库的结构都不一样

  • 每个库的数据也不一样,没有交集

  • 所有库的并集是全量数据

场景:系统绝对并发量上来了,并且可以抽象出单独的业务模块。

分析:到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。

再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。

垂直分表

垂直分表,如下图:

概念:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。

结果:

  • 每个表的结构都不一样

  • 每个表的数据也不一样,一般来说,每个表的字段至少有一列交集,一般是主键,用于关联数据

  • 所有表的并集是全量数据

场景:系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。

以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读 IO,产生 IO 瓶颈。

分析:可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。

这样更多的热点数据就能被缓存下来,进而减少了随机读 IO。拆了之后,要想获得全部数据就需要关联两个表来取数据。

但记住,千万别用 join,因为 join 不仅会增加 CPU 负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。

关联数据,应该在业务 Service 层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。

分库分表工具

常用的分库分表工具如下:

  • sharding-sphere:jar,前身是 sharding-jdbc。

  • TDDL:jar,Taobao Distribute Data Layer。

  • Mycat:中间件。

  • ......


注:工具的利弊,请自行调研,官网和社区优先。


分库分表步骤

根据容量(当前容量和增长量)评估分库或分表个数→选 key(均匀)→分表规则(hash 或 range 等)→执行(一般双写)→扩容问题(尽量减少数据的移动)。

分库分表问题

非 partition key 的查询问题

基于水平分库分表,拆分策略为常用的 hash 法。

①端上除了 partition key 只有一个非 partition key 作为条件查询。

映射法,如下图:

基因法,如下图:

注:写入时,基因法生成 user_id,如图。关于 xbit 基因,例如要分 8 张表,23=8,故 x 取 3,即 3bit 基因。

根据 user_id 查询时可直接取模路由到对应的分库或分表。根据 user_name 查询时,先通过 user_name_code 生成函数生成 user_name_code 再对其取模路由到对应的分库或分表。id 生成常用 Snowflake 算法。

②端上除了 partition key 不止一个非 partition key 作为条件查询

映射法,如下图:

冗余法,如下图:

注:按照 order_id 或 buyer_id 查询时路由到 db_o_buyer 库中,按照 seller_id 查询时路由到 db_o_seller 库中。感觉有点本末倒置!有其他好的办法吗?改变技术栈呢?

③后台除了 partition key 还有各种非 partition key 组合条件查询

NoSQL 法,如下图:

冗余法,如下图:


非 partition key 跨库跨表分页查询问题

基于水平分库分表,拆分策略为常用的 hash 法。注:用 NoSQL 法解决(ES 等)。

扩容问题

基于水平分库分表,拆分策略为常用的 hash 法。

①水平扩容库(升级从库法)

注:扩容是成倍的。

②水平扩容表(双写迁移法)

步骤如下:

  • 第一步:(同步双写)修改应用配置和代码,加上双写,部署。

  • 第二步:(同步双写)将老库中的老数据复制到新库中。

  • 第三步:(同步双写)以老库为准校对新库中的老数据。

  • 第四步:(同步双写)修改应用配置和代码,去掉双写,部署。

注:双写是通用方案。


分库分表总结

关于分库分表总结如下:

  • 分库分表,首先得知道瓶颈在哪里,然后才能合理地拆分(分库还是分表?水平还是垂直?分几个?)。且不可为了分库分表而拆分。

  • 选 key 很重要,既要考虑到拆分均匀,也要考虑到非 partition key 的查询。

  • 只要能满足需求,拆分规则越简单越好。

作者:尜尜人物

编辑:陶家龙

出处:cnblogs.com/littlecharacter/p/9342129.html


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

相关文章

python mysql分库分表_干货 : 常用MySQL分库分表方案

Python乱炖推荐搜索后浪 动森玩家 送书 数据分析 一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞…

php分库分表技术,谈谈关于分库分表的方案

1. 数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发量、吞吐量、崩溃)。 1.1. IO瓶颈 第一种:磁盘读IO瓶颈,…

这应该是全网最全的分库分表方案了

一、数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧(并发…

MySQL第六讲 MySQL分库分表方案

分库分表概念 分库分表就是业务系统将数据写请求分发到master节点,而读请求分发到slave 节点的一种方案,可以大大提高整个数据库集群的性能。但是要注意,分库分表的 一整套逻辑全部是由客户端自行实现的。而对于MySQL集群,数据主从…

分库分表方案对比

房晓乐(葱头巴巴),PingCAP 资深解决方案架构师,前美团数据库专家、美团云 CDS 架构师、前搜狗、百度资深 DBA,擅长研究各种数据库架构,NewSQL 布道者。 原文链接:https://dbaplus.cn/news-11-1…

分库分表方案

一、为什么要进行分库分表 当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表。 …

分库分表设计方案

一、为什么要分库分表? 随着业务的不断发展,数据量不断增加,因此数据操作,如增删改查的开销也会越来越大,原来基于单库单表的设计已经不能满足存储需求,数据库随时面临爆库风险; 再加上物理服务器的资源有…

python:numpy的corrcoef计算相关系数

corrcoef(x, yNone, rowvarTrue, biasnp._NoValue, ddofnp._NoValue)函数常用的是前三个参数,x和y分别是需要计算相关系数的两个随机变量,当rowvar为True(默认情况)时,每一行代表一个随机变量,否则每一列代表一个随机变量。 该函数…

python 计算相关性系数np.corrcoef()

计算相关性是分析连续型与连续型双变量的常用方法,散点图只能直观的显示双变量(特征)之间的关系,但并不能说明关系的强弱,而相关性可以对变量之间的关系进行量化分析。 相关性系数的公式如下: 相关性系数…

Numpy库 numpy.corrcoef()函数

相关系数公式: 其他详见: 1. Python Numpy库 numpy.corrcoef()函数讲解 2. 协方差、方差、标准差、协方差系数 3. 标准差、方差、协方差三者的表示意义

MATLAB中的corrcoef函数求两个向量的相关系数。

 想用MATLAB中的corrcoef函数求两个向量的相关系数。 比如A[1 2 3];B[5 3 7]; r corrcoef(A,B)可以求出相关系数是0.5.为什么两个向量的元素都要是3个以上才行?而只有两个元素的向量如A[1 2];B[5 3];不管怎么随机的取,相关系数都…

使用numpy计算相关系数矩阵:np.corrcoef()

【小白从小学Python、C、Java】 【Python-计算机等级考试二级】 【Python-数据分析】 使用numpy计算相关系数矩阵 np.corrcoef() 选择题 关于以下代码说法错误的是? import numpy as np array1np.array([[1,2,3], [2,3,4], [2,3,3], [4,3,2], [4,3,3]]) print(array1) print(&…

matlab 计算相关系数,MATLAB如何使用corrcoef函数计算样本数据的相关系数

MATLAB如何使用corrcoef函数计算样本数据的相关系数 【语法说明】 Rcorrcoef(X):如果X为向量,函数返回1;如果X为mn 矩阵,则以每行为观测值,每列为一个随机变量计算相关系数,返回一个nn对称矩阵。假设协方差…

numpy.corrcoef()函数讲解

numpy.corrcoef(x, y无, rowvar True, 偏差<无值>, ddof<无值>) 【学习参考】&#xff1a;Python Numpy库 numpy.corrcoef()函数讲解_Hello_xzy_Word的博客-CSDN博客_numpy.corrcoef x&#xff1a; array_like&#xff0c;包含多个变量和观测值的1-D或2-D数组&a…

Python Numpy库 numpy.corrcoef()函数讲解

例子&#xff1a; 代码&#xff1a; import numpy as npArray1 [[1, 2, 3], [4, 5, 6]] Array2 [[11, 25, 346], [734, 48, 49]] Mat1 np.array(Array1) Mat2 np.array(Array2) correlation np.corrcoef(Mat1, Mat2) print("矩阵1\n", Mat1) print("矩阵…

一、求相关函数 corrcoef+协方差矩阵cov

1. 求相关函数corrcoef 一般作用&#xff1a;1&#xff09;结合图表评估数据拟合效果&#xff1b;2&#xff09;评估两组数据之间的互相关联程度&#xff0c;大于0正相关&#xff0c;小于0负相关&#xff0c;等于0不相关。 但此种计算方法反映的是“线性相关”程度&#xff0…

MATLAB 协方差 [cov] 和相关系数 [corrcoef] 说明

A,B为两个长度相同的向量 求协方差 Scov(A,B); b和c数值上是相等的。 求相关系数 Rcorrcoef(A,B) 数值上,f和g是相同到。 相关系数存在许多种类&#xff0c;上述corrcoef 指 pearson correlation coefficient。 性质&#xff1a;向量乘常数&#xff0c;不改变Pearson 相关…

皮尔逊相关分析的MATLAB实现,corr(),corrcoef()函数使用

皮尔逊相关系数可以用来表述两个序列的相关性。 常常用来做数据分析、数据挖掘等工作。 如何简单快捷的实现皮尔逊相关&#xff0c;并得到结果&#xff1f; 需要应用MATLAB中的corr(X, Y)或者 corrcoef(X,Y)函数。 其中corr(X, Y)既可以计算矩阵相关也可以计算序列相关&…

用C语言实现简单的计算器

功能介绍 用C语言实现整形简单的加减乘除操作&#xff08;通常方法与使用函数指针数组的方法&#xff09; 代码实现 方法一 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> #include<stdlib.h>int main() {while (1){double x 0, y 0, ret 0;//定义运…

C语言编写一个计算器(附全源代码)

这个计算器其实是我老师布置的一个c语言大作业,捉摸着搞了那么久的东西不能浪费了吧,于是我分享下我的代码和大概思路 给个关注点个赞,后续我会分享更多我们学生党的作业问题 白嫖党们先看代码,我就先上上全代码,干! 前言: 为了达到目的,首先自学了栈:按照先进后出的…