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

文章目录

  • 〇. 前言
  • 一. 策略对比
  • 二. 使用背景
  • 三. 拆分方法
      • 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

在这里插入图片描述

分库分表是一种常用的数据库优化手段,特别适用于数据量大且并发访问高的场景。以下是关于MySQL分库分表的一些面试题: 1. 请问什么是分库分表分库分表是指将一个大型数据库分成多个小的数据库,再将每个小的数据库进行水平或垂直切分,从而达到提高数据库性能和扩展能力的目的。 2. 为什么需要进行分库分表分库分表可以解决数据库在高并发情况下的性能瓶颈问题,提高数据库的读写能力和负载均衡能力。同时,它还可以解决单表数据量过大导致查询效率低下的问题。 3. 分库分表的常用策略有哪些? 常见的分库分表策略包括水平分表和垂直分表。水平分表是指将一个表的行数据按照某种规则分散到多个表中,例如按照用户ID或时间进行分表;垂直分表是指将一个表按照列的属性划分到多个表中,例如将经常被查询的列和不常被查询的列分成两个表。 4. 分库分表的中间件有哪些? 在实际应用中,常常使用分库分表中间件来简化分库分表的操作。常见的分库分表中间件有Mycat和sharding-jdbc等。 5. 分库分表可能会带来哪些问题? 分库分表可能会对事务处理、跨节点Join操作和分布式事务等方面带来一些挑战。需要注意解决这些问题,以保证分库分表的正确性和稳定性。 以上是关于MySQL分库分表的一些面试题目,希望能对你有所帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值