一、为什么要分库分表
1、首先理解概念,什么时分库分表?
分表:将单表拆分成多张表,数据分散到不同表中。
分库:将单库拆分成多个库,数据分散到不同库中。
2、其次,为什么要分库分表?
分库分表的主要目的是提升数据查询的效率、减轻数据库的压力等。
可以通过缓存、读写分离、索引等方式提升数据查询效率,通过增加硬件资源,比如内存、CPU等减轻数据库的压力。但是日益剧增的数据,使以上的方式都不足以奏效时,分库分表便是一种解决方案,虽然该方案在使用的过程中会遇到不少难题,但好在有开源技术能够帮我们解决大部分难题。
二、分库分表方式
分库分表主要分为以下四种方式:垂直分表、垂直分库、水平分表、水平分库。
1、垂直分表
垂直分表是将一张表根据字段拆分为两个或以上的表,主要体现在表数据量大时,每条记录的查询部分字段频率大,其他字段(占用不少空间)频率小时,可考虑将表进行拆分。根据业务有不同的拆分粒度,满足业务即可。
2、垂直分库
垂直分库是将是将一个数据库中的多张表给分到两个或以上的数据库中,主要体现在根据业务进行划分,将不同业务的表划分到不同的数据库中。
3、水平分表
水平分表是将一张表中的数据给拆分到多张表中,主要体现在一张表的数据特别多的时候,可以将这张表的数据分到同结构的其他表中。
4、水平分库
水平分库是将一个数据库中的表复制一份到一个或以上的数据库中,主要体现在单个数据库无法承担数据量时,可以将数据分到同结构其他数据库中。
三、分库分表应用、问题、解决
1、应用
1)在数据库设计阶段的时候应该需要考虑垂直分库和垂直分表。
2)因为数据量不太容易预估,不清楚数据是否会剧增。因此,不要马上考虑做水平切分,在有一定的数据量时应该优先考虑通过缓存、读写分离、索引等等方式尝试解决,如果以上方式不能够解决查询速度,再考虑去做水平分库和水平分表。
2、问题
1)跨节点连接查询问题
比如:
- 垂直分库中,两张需要关联的表分别在不同数据库中,无法通过join的方式连接。
- 水平分库中,一张表的数据存在于多个数据库中,此时分页查询存在问题,以及对数据进行排序或其他筛选存在很大难度。
2)多数据源管理问题
3、解决
通过开源技术来进行问题的解决,如ShardingSphere、Mycat(Mycat2)等技术。