本章内容主要讲解:它是什么、它的作用、以及它引入的问题和解决方案。
什么是分库分表
分库分表这一概念可以分解为三个主要问题:仅分库、仅分表、以及同时分库和分表。
仅分库:分库指的是将传统单一数据库的数据拆分到多个数据库中,每个数据库存储不同的业务数据表,并部署在不同的服务器上。
仅分表:当一个数据库中某个表的数据量达到一定规模,足以影响性能时,可以进行分表。分表是在同一个数据库内部将一个大表拆分为多个结构相同的小表,以此减轻单一表的数据负担。
同时分库和分表:将单一数据库中的表不仅分拆到多个数据库中,而且在单个数据库中的大表也会根据数据量进行分割,形成多张小表。这些小表随后被存储在不同的数据库中
使用场景
- 分库
- 磁盘空间限制:服务器的磁盘空间已满,且无法扩展,这时候会对写入性能出现问题
- CPU负载高:当服务器的CPU达到上限,且无法升级或扩展,导致处理读写请求会变慢
- 内存不足:当服务器的内存不足是,且无法增加,会直接影响数据库的读写效率,从而形成性能瓶颈
- 网路带宽限制:服务器的网络带宽不足且无法升级,可能会影响数据的传输速度,导致读写操作延迟
- 连接数过多:当数据库服务器的连接数达到上限而无法扩充时,可能会导致新的客户端连接请求等待或超时。
- 分表
- 当表中的数据达到了一定的数量,影响到读写性能的时候
如何拆分库和表
水平拆分:当单个数据表的数据量增长至一定程度时。此策略涉及将这个大表的数据按一定规则分散到多个结构相同的小表中,每个小表包含不同的数据
表拆分
垂直拆分:垂直拆分是将一个数据库表中的数据列按一定的逻辑拆分到两个或多个表中
库拆分
表垂直拆分:表中的字段拆分成两个表,表结构不同
混合拆分:用于处理极大的数据表,将其按列(垂直拆分)和行(水平拆分)同时进行拆分,形成多个更小、更专用的表
拆分策略
Range拆分
据表中某个字段的值范围将数据分配到不同的分区或表中,适合于字段值有自然顺序和可预测分布的情况,如时间、日期、编号等。
hash拆分
是根据表中的某个字段进行拆分,比如(某个字段(%或/)表的数量进行分配到某个大表拆分出来的小表中),这种拆分跟细化了数据落到对应的数据表中
分库分表存在问题
- 使用Range范围进行分表
- 数据分布不均匀,存在热点问题
- 使用Hash进行分表
- 如何选择合适的Shardingkey进行拆分表
- 数据迁移和数据扩展:当分表数量中的数据达到了一定的数据如何进行分表扩展,扩展完如何将数据均匀分布到各个表中
- 分布式事务一致性的问题
- 尽量避免事务
- 使用可靠的消息队列
- 使用分布式的中间件
- 库之间的关联查询/分页/排序
- 如果请求中没有携带Shardingkey该怎么处理








