分库分表

70 阅读3分钟

一、什么是分库分表

分库分表是两个方面,即分库和分表 分库:很简单就是将一个数据库分成多个数据库,并部署到不同机器中。、

比如原来我们要存储的数据是元数据和统计数据是存在一个数据库中,那么我们就可以将元数据和统计数据分开存不同的数据库:元数据库和统计数据库。 image.png

分表:将一个数据库表分成多个表

image.png

二、为什么要分库分表

2.1 为什么需要分库?

(1)分担读写压力:数据库的连接是有限的,那么在大量读写访问数据库的场景下(例如:高并发),MySQL肯定是扛不住的。因此通常会根据业务模块去拆分不同的应用,那么一整个数据库就可以拆分为不同的功能模块数据库,进而分担总的读写压力。

(2)磁盘的存储空间:单个Mysql的单机磁盘容量很容易被占满,这样整个数据库的内存使用率就会大大降低。

2.2 为什么需要分表?

(1)串行查询导致阻塞问题
因为数据库为了保证数据的一致性和完整性,所以处理机制是串行处理过那么串行处理就一定会导致阻塞问题,因此如果都是在同一张表进行处理的话,就会导致处理阻塞。

(2)大数据量查询速度缓慢问题 因为MySQL数据库默认的索引结构是B+树结构,那么对于大数据量的话B+树的高度就会增加,查询速度自然变慢。

B+树
B+树是B树的一种优化,本身两种树都广泛应用于数据库和文件系统中的存储和索引问题 本质上的共性特点是,两种树都是一种有序搜索树,根节点是中间节点。那么就可以根据有序这个条件去有效的知道去哪一棵子树上查询,此外还有一个共性是他的层级结构少,但是宽,这样就减少了IO次数。 而B+树的个性在于,他的叶子节点不仅仅存叶子节点自身的数据,而且还将之前的路径节点数据也放在叶子节点中,并且叶子节点之间形成链表指向,那就会更快的减少多次查询的时简,而不用第二次查询又从根节点出发。

使用场景
当我们的单表数据量后续如果超过百万、千万,那么就可以考虑分表来提高查询速度啦。一般B+树索引高度是2~3层最佳,如果数据量千万级别,可能高度就变4层了,数据量就会明显变慢了。不过业界流传,一般500万数据就要考虑分表了。

3.什么时候考虑分库分表

3.1 考虑分库场景

并行读写吞吐量阻塞时候:当我们考虑并发场景时候,或者说读写的限制影响到查询时间,即并行读写也出现阻塞了,那么这个时候我们可以考虑分库,进而分担查询请求数量,可以认为是一种“分发方式”解决请求。

3.2 考虑分表场景

串行查询处理阻塞的时候:当我们的单个表的数据量过大(百万级别),那么我们就可以考虑分表了

3.如何分库分表

image.png

3.1 垂直拆分

3.2 水平拆分