本篇文章主要整理关于 MySQL 分库分表的一些概述,并没有很深入,主要是因为某人多次的拜托 (是谁我不说,自己发现叭)~~
先开门见山,给出写本篇文章的导火索,分库分表的标准是什么?
其实分库分表的标准在阿里巴巴 Java 开发手册中提到过:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表
问题一:是否当单表行数超过 500 万行或者单表容量超过 2GB,才开始分库分表?
不是,如果可以预计 3 年后数据会超过这个量级,就应该在创建表的时候就进行分库分表
问题二:如果 MySQL 服务器配置较好,是否可以超过 500 万这个量级?
虽然服务器配置更好后,数据量过大时,性能也不错,但以发展的眼光看待,考虑分库分表更佳
下面主要介绍一下分库分表到底是什么?什么情况下会考虑分库分表?分库分表的方式有哪些?
分库,顾名思义是将一个数据库中的表拆分到多个数据库中,如下图所示:
每个数据库连接数都有限制,当并发量过大时,数据库连接数也会增大,这是决定是否分库的直接原因,如果连接数成为数据库的瓶颈时就需要考虑分库
分表,顾名思义是将一个表拆分成多个表,如下图所示:
阿里巴巴 Java 开发手册中推荐:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表,所以决定是否分表的标准是表中记录数和容量,如果当一个表中数据量过大时就需要考虑分表
其实,还可能同时分库分表,这就是既存在并发量过大,又存在单表容量过大的情况~
总结:
切分方案 | 解决问题 |
---|---|
只分库不分表 | 数据库读/写 QPS 过高;数据库连接数不足 |
只分表不分库 | 单表数据量过大,存储性能遇到瓶颈 |
既分库又分表 | 连接数不足 + 单表数据量过大 |
上一部分只是介绍了在何种情况下会考虑分库分表,那如果决定了要分库分表,该如何分呢??
其实分库分表都有两种不同的分法,垂直和水平,排列组合一下就有四种:垂直分表、水平分表、垂直分库、水平分库
将一张表按照字段切分成多个表,通常是根据字段的关系密集程度进行切分,也可以按照常用字段和不常用字段切分,如下图所示:
水平分表又被称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中,如下图所示:
当一个表中数据不断增多时,水平分表是必然的选择,它可以将数据分布到集群的不同节点上,从而缓解单个数据库的压力
按照业务将表进行分类,分布到不同的数据库中,每个数据库可以放到不同的服务器上,如下图所示:
把同一个表的数据按照一定规则拆分到不同的数据库中,每个数据库可以放到不同的服务器上。假设按照表中 id 的奇偶性将数据拆分到不同的数据库中,如下图所示: