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

【MySQL篇10】:四种分库分表详解

文章目录

  • 分库分表:应对海量数据量
    • 1. 垂直分库
    • 2. 垂直分表
    • 3. 水平分库
    • 4. 水平分表
    • 总结分库分表策略

分库分表:应对海量数据量

随着业务的发展,单个数据库实例或单张表的数据量可能会变得非常庞大,导致查询性能下降、写入压力增大、维护困难等问题为了解决这些问题,我们需要采用分库分表 (Sharding) 的技术

分库分表的核心思想是将一个大型数据库或表的数据分散到多个较小、更易于管理的数据库或表中这样可以有效地降低单个数据库或表的负载,提高整体系统的吞吐量可扩展性

分库分表主要有两种策略:垂直分库分表水平分库分表

1. 垂直分库

  • 定义: 垂直分库是根据业务功能或模块将不同的表分散到不同的数据库中简单来说,就是将原本在一个数据库中的不同业务的表,分别放到各自独立的数据库中
  • 类比: 想象一下你有一个大仓库,里面存放着各种各样的物品:食品、服装、电子产品等等垂直分库就像是你在仓库里划分出不同的区域,一个区域专门存放食品,一个区域专门存放服装,一个区域专门存放电子产品
  • 优点:
    • 职责清晰: 每个数据库负责一个独立的业务模块,方便管理和维护
    • 隔离性好: 不同业务之间的数据库相互独立,互不影响,提高了系统的稳定性和可用性
    • 易于扩展: 可以根据不同业务的需求独立扩展数据库资源
  • 缺点:
    • 跨库 Join 困难: 如果需要跨越不同数据库进行 JOIN 操作,会比较复杂,通常需要通过应用层进行关联查询或数据冗余
    • 事务管理复杂: 跨库事务需要分布式事务支持,增加了复杂性
  • 适用场景: 适用于业务模块划分清晰,不同模块之间关联较少的情况;对于微服务架构,每个微服务对应一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分

2. 垂直分表

  • 定义: 垂直分表是将一张表的列按照其重要性或访问频率进行拆分,将不经常访问或字段较多的列拆分到单独的表中
  • 类比: 想象一下你的身份证信息,上面有很多字段:姓名、性别、出生日期、住址、民族等等垂直分表就像是将身份证上的信息拆分成两部分:一部分是经常需要用到的核心信息(姓名、性别),另一部分是不经常用到的详细信息(住址、民族)
  • 优点:
    • 提高查询效率: 经常访问的字段放在一起,可以减少磁盘 I/O,提高查询速度
    • 减少数据冗余: 可以避免在主表中存储大量不常用字段
  • 缺点:
    • Join 操作: 查询完整数据时需要进行 JOIN 操作,可能会增加一些开销
    • 维护复杂: 需要同时维护多张表
  • 适用场景: 适用于单张表字段过多,且部分字段访问频率较低的情况

3. 水平分库

  • 定义: 水平分库是根据某种规则(如用户 ID、订单号等)将一张表的数据分散到多个数据库中的多张表中每个数据库中的表结构是相同的,只是存储的数据范围不同
  • 类比: 想象一下你有一个巨大的图书馆,里面有很多书水平分库就像是你在不同的城市建立了多个图书馆,每个图书馆都存放一部分书,但每个图书馆的内部结构(书架、分类等)是相同的你可以根据书名的首字母或者作者来决定这本书应该放在哪个城市的图书馆
  • 优点:
    • 突破单库容量限制: 可以存储海量数据,突破单个数据库的存储容量限制
    • 提高并发能力: 读写请求可以分散到多个数据库,提高了系统的并发处理能力
    • 易于扩展: 可以根据数据量的增长增加数据库节点
  • 缺点:
    • 分片规则复杂: 需要设计合理的分片规则,否则可能导致数据分布不均匀
    • 跨库查询复杂: 跨越多个数据库进行查询需要分布式查询支持
    • 维护和管理复杂: 需要管理多个数据库实例
  • 适用场景: 适用于数据量巨大,需要突破单库容量限制的情况

4. 水平分表

  • 定义: 水平分表是根据某种规则(如用户 ID、订单号等)将一张表的数据分散到同一个数据库中的多张表中每个表结构是相同的,只是存储的数据范围不同
  • 举例: 对于类似历史(积分)排行榜一类的表,就可以按照月份、赛季等进行水平拆分,加快查询效率,需要查询某个月份、赛季排行,直接拼接含有月份、赛季信息排行的表名(分表表名一般与分表依据有关),到专属的分表中查询即可
  • 优点:
    • 提高查询效率: 查询时只需要在部分表中进行扫描,减少了扫描范围
    • 提高并发能力: 读写请求可以分散到多个表中,提高了表的并发处理能力
  • 缺点:
    • 分片规则复杂: 需要设计合理的分片规则
    • 跨表查询复杂: 跨越多个表进行查询需要分布式查询支持
  • 适用场景: 适用于单张表数据量巨大,但单个数据库容量尚可,主要想提高单表性能的情况

总结分库分表策略

策略拆分维度拆分对象优点缺点适用场景
垂直分库业务功能数据库职责清晰,隔离性好,易于扩展跨库 Join/事务复杂业务模块划分清晰,关联较少
垂直分表字段提高查询效率,减少数据冗余Join 操作,维护复杂单表字段多,部分字段访问频率低
水平分库数据行数据库突破单库容量限制,提高并发能力,易于扩展分片规则/跨库查询/维护复杂数据量巨大,需要突破单库容量限制
水平分表数据行提高查询效率,提高并发能力分片规则/跨表查询复杂单表数据量巨大,但单库容量尚可,提高单表性能

通常情况下,实际应用中会结合使用 垂直分库水平分库分表 策略,根据具体的业务场景和数据量来选择最合适的分片方案

http://www.xdnf.cn/news/1062199.html

相关文章:

  • Symbol.iterator 详解
  • Windows 10 防火墙 0x8007045b 打不开
  • Rust 项目文档生成之旅:cargo doc
  • 博士,超28岁,出局!
  • MySQL复杂查询优化实战:从多表关联到子查询的性能突破
  • 掌握Bash脚本编写:从服务启动脚本到语法精要
  • Xilinx XC7A12T‑1CPG238I Artix‑7 FPGA
  • SAM2论文解读-既实现了视频的分割一切,又比图像的分割一切SAM更快更好
  • 猿人学js逆向比赛第一届第九题
  • 基于物联网的智能衣柜系统设计
  • Redis如何解决缓存击穿,缓存雪崩,缓存穿透
  • .docx 和 .doc 都是 Word 文档格式的区别
  • 华为 FreeArc耳机不弹窗?
  • css 实现1个像素在不同分辨率屏幕上画网格线
  • 如何正确处理音频数据:16位整数与32位浮点数
  • 【考研数学:高数11】一元函数积分学的应用(二)——积分等式和积分不等式
  • SSE 流与普通 HTTP 响应的区别
  • FPGA基础 -- Verilog 层次路径名
  • 物体变化下的迈克尔逊干涉:条纹密度、载波解调与双曝光去畸变
  • DAY 54 python打卡
  • 解锁数据宝藏:数据挖掘之数据预处理全解析
  • 【MySQL性能优化】DISTINCT和GROUP BY去重性能深度剖析
  • 基于存储过程的MySQL自动化DDL同步系统设计
  • 技术评测:三丰云免费服务器的真实能力边界
  • Vue 比较两个数组对象,页面展示差异数据值
  • GO 原子操作面试题及参考答案
  • 前端页面Javascript数组
  • 西门子PLC模块上的SF(系统故障)红灯故障分析
  • 前端工程结构设计指南:如何让模块解耦、易维护、可拓展
  • postgresql 函数调试