【面试资料】MySQL篇 之 分库分表

本文探讨了MySQL数据库优化中的分库分表策略,对比了主从分离与分库分表的区别,介绍了垂直拆分(按业务结构)和水平拆分(按数据量)的方法,以及它们在处理大规模数据和性能提升中的作用。同时,讨论了分库分表带来的问题及使用分片中间件的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

  • 〇. 前言
  • 一. 策略对比
  • 二. 使用背景
  • 三. 拆分方法
      • 1. 垂直拆分:拆【结构】
      • 2. 水平拆分:拆【数据量】
  • 四. 问题与策略

〇. 前言

【面试资料】MySQL篇 之 索引 中,我们曾经介绍过5种SQL优化的方法:

  • 数据表设计优化
  • 索引设计优化
  • SQL语句书写规范
  • 主从分离
  • 分库分表

其中,【主从分离】的详细内容可以参考这边文章 👉 【面试资料】MySQL篇 之 主从同步原理,本文将会重点剖析【分库分表】相关内容。

一. 策略对比

我们不妨回顾,主从分离 主要是为了解决 读写压力不均衡的问题,让读操作不受写操作影响,加快查询效率。同时,多个Slave同时承担访问工作,帮助实现数据库端的负载均衡效果。
在这里插入图片描述

然而,读写分离中的 Master 和 Slave 存储的数据都是相同的,数据量都是相同的,这种主从分离架构仅仅能起到缓解访问压力的作用,不能缓解存储压力。

例如:现在有一张5000W数据量的大表,同时存储于Master与Slave,用户向数据库查询数据时,依旧是对一张千万级的大表进行访问。

而【分库分表】可以有效解决这一问题,即数据库的存储压力
在这里插入图片描述

总结一下两个SQL优化策略:

  • 主从分离:读写互不影响,多个Slave分担压力,“外部” 缓解访问压力
  • 分库分表:大库→小库×n,大表→小表×n,“内部” 分解了存储压力,进而加快查询速度。

接下来我们就重点介绍一下【分库分表】这一种数据库优化策略。

二. 使用背景

分库分表也有自己的使用场景,并不是所有的业务都需要进行分库分表操作的。

  • 单表 数据量 超过1000W 或 20G
  • 优化 已经解决不了性能问题(读写分离、索引…)
  • 遭遇IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数过多…)

三. 拆分方法

在数据库优化中,【分库分表】是一个大概念,我们将进一步细化为4种拆分方法,详细讲解它们的原理与特点。
在这里插入图片描述


1. 垂直拆分:拆【结构】


在这里插入图片描述
(1)垂直分库:把 服务于不同业务的表 拆分到 不同的库。

(2)垂直分库的特点【业务划分】

  • 按照业务对数据分级管理、维护、监控、扩展
  • 高并发情况下,提高磁盘IO和数据量连接数

在这里插入图片描述
(1)垂直分表:依照规则,把 不同的字段 拆分到 不同的表。

常见拆分规则:
不常用字段 放在一张表
② 把 大字段(text、blob…)拆分到附表中

(2)垂直分表的特点【冷热分离】

  • 冷热数据分离
  • 减少IO过度争抢,两表互不影响


2. 水平拆分:拆【数据量】


在这里插入图片描述
(1)水平分库一个库的数据 拆分到 多个库。

常见路由规则:
① 根据 id 取模
② 按照 id 范围 路由,例如:结点1(1 ~ 100W)、结点2(100W ~ 200W)…

(2)水平分库的特点【单库减载】

  • 解决 单库大数据量,解决 高并发 瓶颈
  • 提高 系统稳定性、可用性

在这里插入图片描述(1)水平分表一个表的数据 拆分到 多个表(可以存储于同一个库内)。

常见路由规则:参照 “水平分库” 即可。

(2)水平分表的特点【单表减载】

  • 解决 单表数据量过大 所带来的性能问题
  • 避免IO争抢,减少锁表几率


👉 综合来说,

  • 垂直拆分:
    每个库 包含 部分表每张表 包含 部分列 / 所有行
    ② 注重 结构划分
    ③ 注重 业务逻辑冷热拆分
  • 水平拆分:
    每个库 包含 所有表每张表 包含 所有列 / 部分行
    ② 注重 数据量拆分
    ③ 注重 库表减载性能稳定

分库分表 在 负载均衡、高并发、系统稳定可用、优化系统结构与性能 等方面都有深远意义;

垂直分库分表 与 水平分库 是更加常用的企业级策略。

四. 问题与策略

水平分库分表为系统带来性能跃升的同时,也为开发带来了诸多技术问题

  • 分布式 事务一致性
  • 跨节点 关联查询(inner / left / right… join)
  • 跨节点 分页、排序
  • 主键重复

解决上述问题最流行、最简便的方法就是使用分库分表中间件,常用的中间件有:

  • sharding-sphere
  • mycat

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值