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