2. 分库分表种类
拆分数据库有垂直拆分和水平拆分。
2.1 垂直分片
按照业务拆分的方式称为垂直分片,又称为纵向拆分,它的核心理念是专库专用。 在拆分之前,一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中,从而将压力分散至不同的数据库。 下图展示了根据业务需要,将用户表和订单表垂直分片到不同的数据库的方案。
垂直分片往往需要对架构和设计进行调整。通常来讲,是来不及应对互联网业务需求快速变化的;而且,它也并无法真正的解决单点瓶颈。 垂直拆分可以缓解数据量和访问量带来的问题,但无法根治。如果垂直拆分之后,表中的数据量依然超过单节点所能承载的阈值,则需要水平分片来进一步处理。垂直拆分,一般是为了划分服务,不同的团队负责的服务对应的表统一到不同的库中,利于开发和维护。
2.2 水平分片
水平分片又称为横向拆分。相对于垂直分片,它不再将数据根据业务逻辑分类,而是通过某个字段(或某几个字段),根据某种规则将数据分散至多个库或表中,每个分片仅包含数据的一部分。 例如:根据主键分片,偶数主键的记录放入 0 库(或表),奇数主键的记录放入 1 库(或表),如下所示。
select * from orders where id=1;
select * from orders where id=2;
水平分片从理论上突破了单机数据量处理的瓶颈,并且扩展相对自由,是数据分片的标准解决方案。
分库分表种类介绍
2.3 分库分表种类介绍
水平分表从具体实现上又可以分为 3 种:只分表、只分库、分库分表,下图展示了这三种情况:
2.3.1 只分表
只分表:将 db 库中的 orders 表拆分为 2 个分表,orders0 和 orders1,这两个表还位于同一个库中。
2.3.2 只分库
只分库:将 db 库拆分为 db0 和 db1 两个库,同时在 db0 和 db1 库中各自新建一个 orders 表,db0. orders 表和 db1. orders 表中各自只存原来的 db. orders 表中的部分数据。
2.3.3 分库分表
分库分表:将 db 库拆分为 db0 和 db1 两个库,db0 中包含 orders0、orders1 两个分表,db1 中包含 orders3、orders4 两个分表。
在分库分表的情况下,数据是如何拆分的呢?假设 db 库的 orders 表中原来有 4000W 条数据,现在将 db 库拆分为 2 个分库 db0 和 db1,orders 表拆分为 orders0、orders1、orders2、orders3 四个分表,每个分表存储 1000W 条数据 (可能因分片的值,数量略有差距)。 分片主要就是指这种分库分表.