分库分表

本篇文章主要整理关于 MySQL 分库分表的一些概述,并没有很深入,主要是因为某人多次的拜托 (是谁我不说,自己发现叭)~~

分库分表判断标准

先开门见山,给出写本篇文章的导火索,分库分表的标准是什么?

其实分库分表的标准在阿里巴巴 Java 开发手册中提到过:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表

问题一:是否当单表行数超过 500 万行或者单表容量超过 2GB,才开始分库分表?

问题二:如果 MySQL 服务器配置较好,是否可以超过 500 万这个量级?

下面主要介绍一下分库分表到底是什么?什么情况下会考虑分库分表?分库分表的方式有哪些?

什么是分库分表

分库,顾名思义是将一个数据库中的表拆分到多个数据库中,如下图所示:

1

每个数据库连接数都有限制,当并发量过大时,数据库连接数也会增大,这是决定是否分库的直接原因,如果连接数成为数据库的瓶颈时就需要考虑分库

分表,顾名思义是将一个表拆分成多个表,如下图所示:

2

阿里巴巴 Java 开发手册中推荐:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表,所以决定是否分表的标准是表中记录数和容量,如果当一个表中数据量过大时就需要考虑分表

其实,还可能同时分库分表,这就是既存在并发量过大,又存在单表容量过大的情况~

总结:

切分方案解决问题
只分库不分表数据库读/写 QPS 过高;数据库连接数不足
只分表不分库单表数据量过大,存储性能遇到瓶颈
既分库又分表连接数不足 + 单表数据量过大

 

如何分库分表

上一部分只是介绍了在何种情况下会考虑分库分表,那如果决定了要分库分表,该如何分呢??

其实分库分表都有两种不同的分法,垂直和水平,排列组合一下就有四种:垂直分表、水平分表、垂直分库、水平分库

垂直分表

将一张表按照字段切分成多个表,通常是根据字段的关系密集程度进行切分,也可以按照常用字段和不常用字段切分,如下图所示:

3

水平分表

水平分表又被称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中,如下图所示:

4

当一个表中数据不断增多时,水平分表是必然的选择,它可以将数据分布到集群的不同节点上,从而缓解单个数据库的压力

垂直分库

按照业务将表进行分类,分布到不同的数据库中,每个数据库可以放到不同的服务器上,如下图所示:

5

水平分库

把同一个表的数据按照一定规则拆分到不同的数据库中,每个数据库可以放到不同的服务器上。假设按照表中 id 的奇偶性将数据拆分到不同的数据库中,如下图所示:

6