目录
1、为什么要分库分表?
随着业务的不断发展,系统数据量不断增加,即便正确设置了索引,仍然无法掩盖因为数据量过大从而导致的数据库性能下降的事实。 对于单台 MySQL 服务器来说,硬件资源(如存储容量、连接数与处理能力)是有限的。当数据量过大或读写操作并发过高时,超出了单服务器的性能瓶颈,可能会对系统的稳定性产生严重隐患,甚或导致系统整体不可用。
在仅查询请求量增加的场景中,通过主从架构实现读写分离能够满足业务读多写少的需求,从而保证系统的可靠性。然而,当数据库中单表数据量增大时,业务操作的耗时会增加。有时,由于业务特点的限制,归档或删除操作无法从根本上解决问题。此外,进行大表结构变更时需要拷贝数据,若表数据量过大会导致无剩余空间进行表结构修改。
当单表数据量过大或写操作负荷过高,以至于达到存储或性能的上限时,必须通过数据切分等方式进行治理。核心思想是通过分割数据,确保单表和单机的负荷在机器性能许可的范围内。
2、切分方案有哪些?
切分方案 | 主要解决的问题 |
---|---|
只分库不分表(分库) | 数据库读/写QPS过高,数据库连接数不足 |
只分表不分库(分表) | 单表数据量过大,存储性能遇到瓶颈 |
既分库又分表(分库分表) | 以上两种问题 |
2.1 分库
分库,指的是将数据从单个数据库拆分成多个数据库的过程。拆分后的数据库往往部署在多套集群中,这也就意味着降低了单个集群的负载压力,提升整体的读写性能。
分库通常有两种方式,垂直分库和水平分库。
2.1.1 垂直分库
垂直分库是指根据业务领域划分,将不同领域的库表拆分到多个数据库中,从而分散数据存储和读取压力,降低数据层面的耦合度。
2.1.2 水平分库
水平分库通常与分表操作一起进行。当单表数据量过大,导致存储容量和读写性能