每日 3000万订单,如何分库分表?

在互联网大厂,分库分表是标配,作为跳槽季,分库分表肯定也是面试的热点,今天我们就来聊聊如何分库分表 。
本文大纲
 

  • 什么是分库分表?
  • 如何切分库和表?
  • 为什么要分库分表?
  • 切分策略
  • 分库分表产生的问题
  • 分库分表如何落地?
 
一、什么是分库分表?
1.1 分库
分库是指在表数量不变的情况下对库进行切分 。
举例:如下图,数据库 A 中存放了 user 和 order 两张表,将两张表切分到两个数据库中,user 表放到 database A,order 表放到 database B 。
每日 3000万订单,如何分库分表?

文章插图
 
1.2 分表
分表是指在库数量不变的情况下对表进行切分 。
举例:如下图,数据库 A 中存放了 user 表,将 user 表切分成 user1 和 user2 两张表并放到 database A 中 。
每日 3000万订单,如何分库分表?

文章插图
 
1.3 分库分表
分库分表是指库和表都切分,数量都发生变化 。
举例:如下图,数据库 A 中存放了 user 表,将 user 表切分成 user1、user2、user3、user4 四张表,user1 和 user2 放到 database A 中,user3 和 user4 放到 database B 中 。
每日 3000万订单,如何分库分表?

文章插图
 
二、如何切分库和表?
主流的切分方式有 3 种:水平切分、垂直切分和混合切分 。
2.1 水平切分
水平切分包含水平分库和水平分表 。
2.1.1 水平分表
水平分表指的表结构不变,将单表数据切分成多表 。切分后的结果:
 
每个表的结构一样; 每个表的数据不一样; 所有表的数据并集为全量数据;
 
切分抽象图如下:
每日 3000万订单,如何分库分表?

文章插图
 
举例:如下图,order 表,按照 oder_id 的数据范围水平切分后变成了 order1 和 order2 表,两个表的结构一样,数据不同 。
每日 3000万订单,如何分库分表?

文章插图
 
2.1.2 水平分库
水平分库是指,将表水平切分后分到不同的数据库,使得每个库具有相同的表,表中的数据不相同,水平分库一般是伴随水平分表 。
举例:如下图,order 表,水平切分后,分到 database A 和 database B 中,这样原来一个库就被拆分成 2 个库 。
每日 3000万订单,如何分库分表?

文章插图
 
2.2 垂直切分
垂直切分包含垂直分库和垂直分表 。
2.2.1 垂直分表
垂直分表指将存在一张表中的字段切分到多张表 。切分后的结果:
 
每个表的结构不一样; 每个表的数据不一样; 所有表的字段并集是原表的字段;
 
切分抽象图如下:
每日 3000万订单,如何分库分表?

文章插图
 
举例:如下图,order 表,根据字段垂直切分,切分后 order_base 表包含一部分字段的数据 和 order_info 表包含另一部分字段的数据 。
每日 3000万订单,如何分库分表?

文章插图
 
2.2.2 垂直分库
垂直分库指的是,将单个库中的表分到多个库,每个库包含的表不一样 。
举例:如下图,database A 中的 order 表 和 user 表,垂直分库为 database A 包含 order 表,database B 包含 user 表 。
每日 3000万订单,如何分库分表?

文章插图
 
2.3 混合切分
混合切分其实就是水平切分和垂直切分的组合,切分抽象图如下:
每日 3000万订单,如何分库分表?

文章插图
 
举例:如下图,order 表,按照 oder_id 数据范围做了水平切分,并且按照表字段做了垂直切分 。
每日 3000万订单,如何分库分表?

文章插图
 
说明:上面的举例只是为了更好的展示如何切分,并不包含真实业务内容 。
三、为什么要分库分表?
先看个"公司食堂打饭"生活实例,新公司刚开始员工人数比较少,一个窗口能够应付员工的打饭需求,如下图:
每日 3000万订单,如何分库分表?


推荐阅读