高并发写场景方案 1 : 数据分片之数据库分库分表
数据分片思想:可以将资源拆开分为多份,拆分的多份小的资源一起构成完整资源。
分库和分表
分库: 分库指的是将数据库拆分为多个小数据库,原来存储在单个数据库中的数据被分开存储到各个小数据库中。
分表:分表指的是将单个数据表拆分为多个结构完全一致的表,原来存储在单个数据表中的数据被分开存储到各个表中。
大部分互联网应用都绕不开数据库分库分表 , 因为随着业务的不断发展和用户活跃度的提高 , 数据库会面临诸多挑战。
- 数据量大(分表解决)
- 影响性能:当业务发展到一定阶段时 , 数据库中已存储了海量的存量数据 , 每个数据表中都存储了千万行甚至上亿行数据 , 业务方对数据表执行 SQL 语句时扫描的数据行增多 , 性能开销被严重放大 。
- 磁盘 I/O 增加:以 MySQL 数据库为例 , 如果单个数据表中的数据量超过 2000 万行 , 则会导致表结构 B+ 树的层级增多 , 数据读 / 写的磁盘 I/O操作次数增加 。
- DDL 语句执行缓慢: 在涉及数据表结构修改的场景下 , DDL 语句执行完成消耗的时间令人难以接受 。
- 并发量大(分库解决)
- 耗尽服务器资源: 海量用户访问单个数据库 , 很快会达到数据库处理能力的上限 , 无论是数据库的最大请求连接数 、 CPU 资源 、 内存资源还是网络带宽均有可能成为性能瓶颈。
分表的目的是提高一台服务器的单数据库处理能力 , 而分库的目的是充分利用多台服务器资源。
在拆分维度上 , 分库分表可以分为垂直拆分和水平拆分 , 其中垂直拆分侧重基于业务拆分 , 而水平拆分侧重基于数据拆分。
垂直拆分
垂直拆分有垂直分库,垂直分表。
垂直分库
按照业务分库,每一个业务对应一个数据库。其核心是 “ 专库专用 ”
- **解耦:**垂直分库可以实现不同业务归属的数据解耦 , 将不同业务数据交给各业务研发团队独立维护 , 有效保证了各团队的职责单一 。
- 提高并发量:在高并发场景下,由于垂直分库使用不同的服务器维护不同业务的数据库 , 数据库并发量得到一定程度的提升
垂直分表
垂直分表指的是将一个数据表按照字段分成多个表 , 每个表存储其中一部分字段 。
分表的依据可以是字段被频繁访问的频率 、 字段值大小等。
-
垂直分表可以很好地**隔离核心数据和非核心数据 **。
-
数据库是以行为单位将数据加载到内存中的 , 通过垂直分表拆分以后核心数据表的字段大多访问频率较高 , 且字段值也都较小 。 因此可以将更多的数据加载到内存中 , 来提高查询的命中率 , 减少磁盘 I/O, 以此来提升数据库性能.
-
垂直分表仅适合数据量不大但字段较多的数据存储场景 。
-
由于拆分后各表的数据行没有变化 , 因此垂直分表并没有消除单表数据量过大的问题.
水平拆分
水平拆分同样包括水平分库与水平分表。
水平分库
水平分库是指将同一个数据库中的数据按照某种规则拆分到多个数据库中。
这些数据库可以被部署在不同的服务器上 。 并且每个数据库拥有哪些表以及每个表的结构都与拆分