MySQL 分库分表
# 前言
MySQL 分库分表是一种数据库分割和划分数据表的技术。它将原本存储在单个数据库中的数据分散到多个数据库中,将原本单个表中的数据分散到多个数据表中。通过这种方式,可以提高数据库的查询性能和扩展性,同时降低数据库的负载
当数据库中存储的数据量庞大,且并发访问量高时,单个数据库可能无法满足快速查询和高并发的需求。此时,通过分库分表可以将数据分散存储,提高查询效率和负载均衡,进而提高系统的性能
常见的分库分表中间件包括 MyCAT、Atlas、ShardingSphere 等。这些中间件可以提供高性能的分库分表功能,并且具有一些自动化的管理工具和特性
但是上面这种方式会造成应用程序的侵入,如果成本允许的情况下,使用诸如 PingCAP TiDB,阿里云 DRDS等分布式数据库方案会更合适,但对应用程序没有侵入性,同时也可以比较好的支撑业务增长和系统快速迭代
# 类型
# 1. 水平分库
水平分库是指将原本存储在一个数据库中的数据分散到多个独立的数据库中。实现水平分库的方法一般有两种:
- 按数据范围分库:根据数据的某个字段的取值范围,将数据分散到不同的数据库中。比如,根据用户 ID 的奇偶性将数据分散到两个数据库中。
- 按哈希算法分库:根据数据的哈希值,将数据均匀地分散到多个数据库中。这种分库方式可以保证数据在各个库中的分布相对均衡。
# 2. 垂直分库
垂直分库是指将原本存储在一个数据库中的数据根据表的关系分散到多个数据库中。实现垂直分库的方法一般有两种:
- 按功能分库:将不同功能的数据分散到不同的数据库中。比如,将用户信息和订单信息分别存储在不同的数据库中。
- 按表的关系分库:将数据库中的表按照其关系划分到不同的数据库中。比如,将用户表和订单表分别存储在不同的数据库中。
# 3. 水平分表
水平分表是指将原本存在单个数据表中的数据分散存储到多个数据表中。实现水平分表的方法一般有两种:
- 按数据范围分表:根据数据的某个字段的取值范围,将数据分散到不同的数据表中。比如,根据用户 ID 的奇偶性将数据分散到两个数据表中。
- 按哈希算法分表:根据数据的哈希值,将数据均匀地分散到多个数据表中。这种分表方式可以保证数据在各个表中的分布相对均匀。
# 4. 垂直分表
垂直分表是指将原本存在单个数据库表中的字段根据字段的不同特性分散到多个数据表中。实现垂直分表的方法一般有两种:
- 按类型分表:将不同类型的字段分散到不同的数据表中。比如,将用户的基本信息和扩展信息分别存储在不同的数据表中。
- 按字段关系分表:将字段之间有关联的数据分散存储到不同的数据表中。比如,将用户的基本信息和订单信息分别存储在不同的数据表中。
# 常见问题
分库分表涉及到对数据库访问部分的重构,需要通过分布式访问框架或代码层面进行适配。因此,对业务代码的影响会比较大,需要进行大量修改和优化
跨库查询和跨库事务是分库分表中需要解决的难点。对于跨库查询,可以通过分布式查询引擎或中间件进行处理;对于跨库事务,可以使用两阶段提交等分布式事务方案
分库分表会增加系统的复杂性,包括数据一致性、数据迁移、数据恢复等方面的挑战。因此,在引入分库分表之前,需要充分评估系统的可扩展性和团队的技术实力
# 步骤
文档:数据分片 :: ShardingSphere (apache.org) (opens new window)