分库分表用于应对当前互联网常见的两个场景——大数据量和高并发。他们都可以分为垂直拆分和水平拆分两种。
- 垂直拆分是根据业务将一个库(表)拆分为多个库(表)。如:将原本同一张表中经常访问和不常访问的字段,拆分至不同的表中;按业务划分将不同的表存放在不同的库里。
- 水平拆分则是根据分片算法将一个库(表)拆分为多个库(表)。如:将原本的order表拆分成order_1、order_2、order_3多张表,每个表的数据结构一模一样,存取数据都是要按照ID的最后一位以3取余,尾数是1的放入第1个表,尾数是2的放入第2个表这样;分库也一样,将原本一个库复制成多个库,每个库里面的表结构、字段结构一模一样,只是存放的数据不一样,所有库的数据的和就是所有数据。
分表是针对解决数据量过大导致检索变慢的问题,但无法解决过多并发请求访问同一个库,导致数据库响应变慢的问题。而分库就可以将同一个库的并发量拆分到多个库,减轻单个库的并发压力。
分库分表是两个不同的概念,他们分别都对应了有水平拆分、垂直拆分的概念,也都代表不一样的意义,解决的问题也不一样,下面具体说明。
- 水平分库
以表的主键字段为依据,按照一定策略(取模,hash等),将本来在一个库中的数据拆分到多个库中。
每个库的表结构都一模一样;
每个库的数据都不一样,没有任何交集;
所有库的表的数据的并集才是全量数据;
- 水平分表
以表的主键字段为依据,按照一定策略(取模,hash等),将本来在一个表中的数据拆分到多个表中。
拆分的表的结构都一样;
拆分的表数据都不一样,没有交集;
拆分的所有表的所有数据并集才是全量数据;
- 垂直分库
以表为单位依据,按照业务归属不同,将不同业务的表拆分到不同的库中。
每个库的结构都不一样;
每个库的数据也不一样,没有交集;
所有库的数据的并集才是全量数据;
- 垂直分表
以字段为依据,按照字段的使用情况(常用和不常用),将表中字段拆到不同的表,主要分为主表和扩展表。
每个表的结构都不一样;
每个表的数据也不一样,一般来说,主表和扩展表的字段至少有一列交集,一般是主键,用于主表和扩展表关联;
所有表的数据的并集是全量数据;
使用场景(什么时候分库,什么时候分表)
- 分表(为了解决单表数据量大)
数据量大,单表超过 4 、500万条数据,这时就要分表了,将一个表的数据拆分成多个表,控制单表的数据不要超过 200万 条。
- 分库(为了解决数据库每秒并发数大)
并发请求大,当每秒到数据库的请求到达了 2000次的时候,就要分库了,将原本一个库的数据结构拆分到几个库去,控制单个库每秒的请求不超过 1000次。
怎么分库分表
市面上有很多实现分库分表的中间件,目前几乎最火的中间件应该是 mycat
粘上一个 mycat 分库分表的使用说明:
https://blog.csdn.net/weixin_38319645/article/details/81537849