在很多小型应用中都没真正使用分库分表,但是说起来并不陌生,因为我们在面试中经常会被问到,今天我们从从以下几个方面来聊聊分库分表:「是什么?解决什么?怎么做?为什么要这么做?即:」
- 分库分表是什么?
- 分库分表解决什么问题?
- 分库分表怎么做?
- 分库分表什么时候做?
- 分库分表引发的问题是什么?
- 分库分表中间件有哪些?
一、什么是分库分表
分库分表其实很好理解,「顾名思义,即把存于一个库的数据分散到多个库中,把存于一个表的数据分散到多个表中」。但是需要明确一点,分库分表不是一件事,而是三件事,也就是「分库分表的三种方案」:
- 「只分库不分表」
- 「只分表不分库」
- 「既分库又分表」
1.1 只分库不分表
「从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中,多个数据库同时提供服务」。
1.2 只分表不分库
「从单张表拆分成多张表的过程,将数据散落在多张表内」。
1.3 既分库又分表
「把存于一个数据库的单表数据分散到不同库的多个表中」。
二、分库分表解决什么问题
大型应用系统需要处理大量用户的请求,比如微信,美团,淘宝等每天都会产生海量的数据,我们知道当数据量或者请求数达到一定数量之后,数据库就会产生性能瓶颈,而为了缓解数据量的压力,比较普遍的方案一方面是使用NoSQL,而另一方面就是分库分表。
2.1 分库解决什么问题
分库就是在我们系统的业务量增长到一定程度之后,「解决数据库本身的性能瓶颈问题」,所以「一般都是业务量增长,遇到以下两种情况时就会考虑分库」:
- 「数据库QPS过高,连接数不足」
数据库的连接是有上限的,在高并发下,大量请求访问数据库,可能会让数据库宕机,致使整个服务不可用,因此我们可以把「单个数据库拆分成多个数据库,分摊请求,缓解单个数据的读写压力,提高并发量」。 - 「磁盘瓶颈」
数据量是随着业务量的增多而增多的,而单个数据库的磁盘存储量也是有限的,把「单个数据库拆分成多个数据库,缓解磁盘压力,降低磁盘使用率」。
2.2 分表解决什么问题
在之前的《单表最大2000W行数据》中,分析了单表的数据存储量,当单表存储的数据过多时,查询数据会非常慢,在高并发场景下,一个