当前位置: 首页 > article >正文

MYSQL中的分库分表及产生的分布式问题

分库分表是分布式数据库架构中常用的优化手段,用于解决单库单表数据量过大、性能瓶颈等问题。其核心思想是将数据分散到多个数据库(分库)或多个表(分表)中,以提升系统的吞吐量、查询性能可扩展性

一:为什么要分库分表 

MySQL单库数据量超过5000万或单表数据量超过1000万时,性能会显著下降。随着数据增长,单库单表的查询和写入效率逐渐成为系统瓶颈。

二:拆分类型

拆分类型可分为两类:水平拆分和垂直拆分。

1.水平拆分

水平拆分又分为水平分库和水平分表。

1)水平分库:将相同表结构的表复制到另一个库中,减少单个数据库的访问压力。

优点

  • 提升系统吞吐量:大幅降低单库数据量,提升查询和写入性能;
  • 便于扩展支持数据库层面的水平扩展(增加数据库节点)。
  • 提高可用性单个数据库故障不会影响整体服务,其他库仍可正常访问。

缺点

  • 跨库查询复杂:需要聚合多个库的数据时,需借助中间件或手动处理,性能较低。
  • 事务一致性难保证:分布式事务实现复杂,通常需引入额外机制。

2)水平分表:是将同一张表的数据分到多个表中,提高查询效率。

优点

  • 单表数据量可控:将大表拆分为小表,避免单表数据量过大导致的索引效率下降、查询变慢等问题。
  • 提高并发性能:不同分表可分散到不同磁盘或物理机,降低I/O争用。

缺点

  • 跨表查询麻烦:需合并多个分表结果,查询复杂。
  • 扩容复杂度高:后期调整分表数量时,需要进行数据迁移。

2.垂直拆分

垂直拆分又分为垂直分库和垂直分表。

1)垂直分库:将不同表分到不同库中,降低单机的访问瓶颈。

优点

  • 业务解耦:按业务维度拆分库,不同业务的数据独立存储,降低耦合度。
  • 资源隔离:不同库可部署在不同服务器,避免资源竞争(如CPU、内存、磁盘IO)。
  • 扩展性强:业务增长时可单独扩展特定库的硬件资源。

缺点

  • 跨库查询复杂:需通过接口或中间件(如ShardingSphere)实现跨库关联查询,开发复杂度高。
  • 事务一致性难保证:分布式事务(如Seata)引入的性能开销。

2)垂直分表:将一张表的不同列拆分到多个表中,比如将热点字段或者长度大的字段单独分表。

优点

  • 冷热数据分离:将高频字段与低频字段拆分,减少单表数据量,提升查询效率。
  • 减少锁冲突:不同业务字段拆分后,更新操作锁定更少数据。

缺点

  • 查询复杂:跨表查询需关联操作,增加开发复杂度;
  • 数据量大:仍需解决单表数据量过大问题。

三:分库分表策略

在选取分库分表的策略前,首先要了解什么是分片键。

分片键(Sharding Key):决定数据分布的字段,需选择高频查询条件(如用户 ID、订单 ID),避免跨分片查询(尽量选取连续的分片放到同一个库或表中)。

1.常见的分片策略

1)哈希取模:对分片字段进行哈希取模(shard_id = hash(key) % node_count)

  优点:

  • 数据分布均匀,不会容易出现冷热数据分离导致性能瓶颈。

  缺点:

  • 扩容时需迁移大量数据(如从 3 库扩至 4 库,需重新计算所有数据的分片)。
  • 会出现跨分片查询的情况(如要查询订单金额前10,需要查询每段分片的前10然后比较)。

2)范围划分:按时间(如年 / 月)或数值范围(如用户 ID>1000 万)分片,适合递增数据(如订单)。

优点:

  • 便于水平扩展,如果要进行扩容,只需要添加节点即可,无需像哈希取模一样要进行数据迁移。
  • 连续分片能够尽可能的避免跨分片查询,提高查询性能。

 缺点:

  • 可能导致热点分片(如最新月份的数据量过大),会被频繁的读和写,从而导致单个分片的数据量访问过大,出现性能瓶颈。

四.分布式问题

1.分布式主键:分库分表后需保证不同库 / 表的主键唯一。

  • UUID:简单易用,但作为主键性能较差(字符串类型,索引效率低)。
  • 雪花算法(Snowflake):生成 64 位唯一整数,包含时间戳、机器 ID 等,性能高且有序,适用于高并发场景。
  • 数据库自增序列:每个分片设置不同的起始值和步长(如库 1 起始 1、步长 3;库 2 起始 2、步长 3),避免主键冲突。

2.分布式事务:分布式事务需要解决跨节点(如跨数据库、跨服务)操作的原子性问题,即确保多个节点的操作要么全部成功,要么全部回滚,下面主要讲解seata中的两种模式。

在讲解两种模式前需要了解三个概念。

  • TM(Transaction Manager):事务管理器
  • TC(Transaction Coordinator):事务协调者
  • RM(Resource Manager):资源管理器
特性AT 模式(Auto Transaction)XA 模式
一致性级别最终一致(柔性事务)强一致(刚性事务)
业务侵入性无侵入(基于生成回滚日志)低侵入(需使用 Seata 提供的 XA 数据源)
性能损耗较低(仅在提交 / 回滚阶段有少量额外开销)较高(两阶段提交需等待所有分支事务响应)
隔离性基于全局锁实现读已提交(RC)支持可重复读(RR)等强隔离级别
适用场景高并发、允许短暂不一致的业务(如电商订单、库存)金融级强一致场景(如资金转账、账户余额)
数据库支持关系型数据库(MySQL、Oracle 等)支持 XA 协议的数据库(MySQL 5.7+、PostgreSQL)

1)AT模式

(1)一阶段(Prepare)

  • 注册分支事务
  • 生成回滚日志:将相关信息存入 UNDO_LOG 表。
  • SQL 执行并提交
  • 释放本地锁:本地事务提交,释放数据库行锁。

(2)二阶段(Commit/Rollback)分为提交和回滚两种情况

  • 提交(Commit):TM(事务管理器)通知 RM(资源管理器)直接删除 UNDO_LOG,无需操作数据库。
  • 回滚(Rollback):RM 通过 UNDO_LOG 中的记录恢复数据。

2)XA模式(两阶段提交模式)

XA 模式基于数据库原生 XA 协议实现强一致事务,遵循“两阶段提交(2PC)” 协议:

(2)一阶段(Prepare)

  • TM 向所有 RM 发送prepare请求。
  • RM 执行本地事务,但不提交,将事务资源锁定。
  • RM 向 TM 返回成功失败

(2)二阶段(Commit/Rollback)

  • 若所有 RM 均返回成功,TM 发送commit,RM 提交本地事务;
  • 若任一 RM 失败,TM 发送rollback,RM 回滚本地事务。

五.Seata 中如何配置?

(一)AT 模式配置示例(基于 Spring Boot)

seata:enabled: trueapplication-id: ${spring.application.name}tx-service-group: my_test_tx_groupconfig:type: nacos  # 配置中心类型nacos:server-addr: 127.0.0.1:8848registry:type: nacos  # 注册中心类型nacos:server-addr: 127.0.0.1:8848data-source-proxy-mode: AT  # 指定AT模式

关键步骤

  1. 引入 Seata 客户端依赖;
  2. 配置数据源代理(DataSourceProxy);
  3. 在需要分布式事务的方法上添加@GlobalTransactional注解。

(二)XA 模式配置示例

seata:data-source-proxy-mode: XA  # 指定XA模式xa-override-boundary: true  # 允许XA事务跨越多个本地事务

关键步骤

  1. 使用 Seata 提供的SeataDataSourceProxyXA包装数据源;
  2. 确保数据库开启 XA 支持(如 MySQL 需设置innodb_support_xa=ON);
  3. 其余配置与 AT 模式类似。

六.总结

维度AT 模式XA 模式
事务协调机制基于 UNDO_LOG 和全局锁基于数据库 XA 协议
资源锁定时间仅在一阶段执行期间锁定(时间短)一阶段到二阶段提交期间一直锁定(时间长)
性能高(接近本地事务)低(两阶段提交开销大)
回滚机制自动根据 UNDO_LOG 回滚依赖数据库回滚能力
隔离级别读已提交(RC)可重复读(RR)等数据库原生级别
异常处理需处理全局锁冲突和补偿失败需处理事务悬挂和协调者故障
  • AT 模式是 Seata 的默认模式,适合大多数高并发、最终一致的业务场景,通过无侵入的方式实现柔性事务。
  • XA 模式适合对一致性要求极高的金融级业务,依赖数据库原生支持实现强一致,但性能较低。
  • 实际应用中,建议根据业务特性混合使用不同模式(如核心链路用 XA,例如转账等功能,非核心用 AT),并结合监控系统及时发现和处理异常。

 

相关文章:

MYSQL中的分库分表及产生的分布式问题

分库分表是分布式数据库架构中常用的优化手段,用于解决单库单表数据量过大、性能瓶颈等问题。其核心思想是将数据分散到多个数据库(分库)或多个表(分表)中,以提升系统的吞吐量、查询性能和可扩展性。 一&am…...

拥塞控制算法cubic 和bbr

1. 背景 CUBIC 和 BBR 是两种用于网络流量控制的拥塞控制算法,广泛应用于传输中,本质上是用于提升网络速度、稳定性和效率的方案。CUBIC 和 BBR 在本质思想、设计目标和工作方式上存在很大的差异,以下是两者的详细对比。 1.1 CUBIC 提出者…...

投影机三色光源和单色光源实拍对比:一场视觉体验的终极较量

一、光源技术:从 “单色模拟” 到 “三色原生” 的进化 (一)单色光源:白光的 “色彩魔术” 单色光源投影机采用单一白光作为基础光源,通过LCD上出现色彩呈现颜色。这种技术路线的优势在于成本可控,早期被广…...

电子电气架构 --- 下一代汽车电子电气架构中的连接性

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

解析极限编程-拥抱变化(第2版)笔记

思维导图(转载) https://www.cnblogs.com/OneFri/p/17055449.html 极限编程(XP)是以人为核心、响应变化、持续交付价值的软件开发方法论 1.核心思想与价值观 XP 建立在 5 个核心价值观 之上: 价值观含义说明沟通团…...

手写Tomcat(一)

一、Tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 1.1 Tomcat基本架构 Servlet接口文件中定义的方法有以下…...

【机器学习基础】机器学习入门核心算法:支持向量机(SVM)

机器学习入门核心算法:支持向量机(SVM) 一、算法逻辑1.1 基本概念1.2 核心思想线性可分情况 二、算法原理与数学推导2.1 原始优化问题2.2 拉格朗日对偶2.3 对偶问题2.4 核函数技巧2.5 软间隔与松弛变量 三、模型评估3.1 评估指标3.2 交叉验证…...

定时清理流媒体服务器录像自动化bash脚本

定时清理流媒体服务器保存录像文件夹 首先创建一个文件,解除读写权限 touch rm_videos.sh chmod 777 rm_videos.sh将内容复制进去,将对应文件夹等需要修改的内容,根据自己的实际需求进行修改 #!/bin/bash# 设置目标目录(修改为你的实际路…...

Logi鼠标切换桌面失效

Mac上习惯了滑屏切换桌面,所以Logi鼠标也定制了切换桌面的动作,有一天发现这个动作失效了,且只有切换桌面的动作失效。 发现Logi Options出现了这个提示,如图所示(具体原因未知,已配置不自动更新版本&…...

Go语言之匿名字段与组合 -《Go语言实战指南》

Go 没有传统的面向对象继承机制,但它通过“匿名字段(embedding)”实现了类似继承的组合方式,使得一个类型可以“继承”另一个类型的字段和方法。 一、什么是匿名字段 匿名字段就是在结构体中嵌套一个类型而不显式命名字段名。该字…...

Linux 进阶命令篇

一、Linux 系统软件安装命令 (一)Ubuntu 系统(基于 Debian) apt :是 Ubuntu 系统中常用的包管理工具,可以自动处理软件依赖关系。 安装命令格式 :sudo apt install 软件名 示例 :…...

OpenCV CUDA模块图像处理------颜色空间处理之拜耳模式去马赛克函数demosaicing()

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数用于在 GPU 上执行拜耳图像(Bayer Pattern)的去马赛克操作(Demosaicing),将单通…...

2025年全国青少年信息素养大赛复赛C++集训(15):因子问题(题目及解析)

2025年全国青少年信息素养大赛复赛C集训(15):因子问题(题目及解析) 题目描述 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制&…...

如何通过仿真软件优化丝杆升降机设计

通过仿真软件优化丝杆升降机设计可从多维度入手,以下为具体方法和分析: 一、基于有限元分析的结构优化 材料优化:通过ANSYS等软件建立三维模型,施加实际工况载荷(如轴向力、径向力、扭矩),计算…...

Vue3进阶教程:1.初次了解vue

1.初次了解vue vue文件目录和各个文件在这里不做介绍 此课程对针对有点vue基础的同学,或者看过我上部分vue的教程 与之前我的Vue教程不同的是,写法和内容有区别 真正的了解Vue3 1.创建vue组件 1.npm create vuelatest 2.取名 3.TS要选上 4.其他先不选 5…...

WordPress免费网站模板下载

大背景图免费wordpress建站模板 这个wordpress模板设计以简约和专业为主题,旨在为用户提供清晰、直观的浏览体验。以下是对其风格、布局和设计理念的详细介绍: 风格 简约现代:整体设计采用简约风格,使用了大量的白色和灰色调&am…...

【深度学习新浪潮】以图搜地点是如何实现的?(含大模型方案)

1. 以图搜地点的实现方式有哪些? 扫描手机照片中的截图并识别出位置信息,主要有以下几种实现方式: 通过照片元数据获取: 原理:现代智能手机拍摄的照片通常会包含Exif(Exchangeable Image File)元数据。Exif中除了有像素信息之外,还包含了光圈、快门、白平衡、ISO、焦距…...

element的el-table翻页选中功能

el-table翻页选中功能 row-key"enterpriseWorkerId" selection-change"handleSelectionChange"<el-table-column type"selection" :reserve-selection"true" width"55"></el-table-column>stuMultipleList: []…...

Python打卡训练营学习记录Day38

知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import torch import torch.nn as nn import torch.opt…...

deepseek开源资料汇总

参考&#xff1a;DeepSeek“开源周”收官&#xff0c;连续五天到底都发布了什么? 目录 一、首日开源-FlashMLA 二、Day2 DeepEP 三、Day3 DeepGEMM 四、Day4 DualPipe & EPLB 五、Day5 3FS & Smallpond 总结 一、首日开源-FlashMLA 多头部潜在注意力机制&#x…...

CollUtil详解

CollUtil 是 Hutool 工具库中的一个工具类&#xff0c;专门用于操作集合&#xff08;Collection&#xff09;。它提供了许多静态方法&#xff0c;可以简化对集合的常见操作&#xff0c;例如判断集合是否为空、合并集合、过滤集合等。 以下是关于 CollUtil 的详细介绍和常用方法…...

Elasticsearch的运维

Elasticsearch 运维工作详解&#xff1a;从基础保障到性能优化 Elasticsearch&#xff08;简称 ES&#xff09;作为分布式搜索和分析引擎&#xff0c;其运维工作需要兼顾集群稳定性、性能效率及数据安全。以下从核心运维模块展开说明&#xff0c;结合实践场景提供可落地的方案…...

Linux编辑器——vim的使用

vim是一款多模式的编辑器。 基本操作&#xff1a;vim打开默认是命令模式&#xff0c;也就是输入命令然后系统执行指令&#xff0c;想要写代码&#xff0c;只需输入字母i&#xff0c;就进入插入模式&#xff0c;写完代码想要退出&#xff0c;按一下Esc&#xff0c;退回到命令模…...

线性回归原理推导与应用(八):逻辑回归二分类乳腺癌数据分类

乳腺癌数据是sklearn中自带的数据集&#xff0c;需要通过相关特征对是否患有乳腺癌进行分类。 数据清洗与建模 首先加载相关库和相关数据 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression import numpy as np import…...

Jenkins分配对应项目权限与用户管理

在日常开发过程中经常会出现用户和权限管理问题&#xff0c;没有配置trigger时&#xff0c;通常需要我们手动构建&#xff0c;但此时前端和后端的朋友没有build权限&#xff0c;导致每次dev环境测试都需要麻烦我们手动去构建&#xff0c;消息传达不及时则会降低开发效率。 现有…...

Mate桌面环境系统与终端模拟器参数配置

说明&#xff1a;   MATE桌面环境在使用中会优化一些参数配置&#xff0c;例如&#xff1a;电源选项、屏幕配置、字体配置、终端模拟器&#xff08;Mate Terminal&#xff09;配置等等。   通常工程师会根据自己喜好调整一些参数&#xff0c;修改后参数的保存位置在/home/u…...

fabric 是一个开源框架,用于使用 AI 增强人类能力。它提供了一个模块化框架,用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题

​一、软件介绍 文末提供程序和源码下载 fabric 是一个开源框架&#xff0c;用于使用 AI 增强人类能力。它提供了一个模块化框架&#xff0c;用于使用一组可在任何地方使用的众包人工智能提示来解决特定问题。 二、What and why 什么和为什么 自 2023 年初和 GenAI 以来&…...

基于PDF流式渲染的Word文档在线预览技术

一、背景介绍 在系统开发中&#xff0c;实现在线文档预览与编辑功能是许多项目的核心需求&#xff0c;但在实际的开发过程中&#xff0c;我们经常会面临以下难点&#xff1a; 1&#xff09;格式兼容性问题&#xff1a;浏览器原生不支持解析Word二进制格式&#xff0c;直接渲染会…...

华为仓颉语言初识:结构体struct和类class的异同

前言 华为仓颉语言是鸿蒙原生应用的一种新的编程语言&#xff0c;采用面向对象的编程思想&#xff0c;为开发者带来新的开发体验。不仅可以和 ArkTs 相互调用&#xff0c;更能提升应用程序的性能&#xff0c;更重要的是仓颉语言的特点结合了 java 和 C 的特点。对开发者来说比…...

数据仓库基础知识总结

1、什么是数据仓库&#xff1f; 权威定义&#xff1a;数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 1&#xff09;数据仓库是用于支持决策、面向分析型数据处理&#xff1b; 2&#xff09;对多个异构的数据源有效集…...