8.2 分库分表简介


1. 分库分表介绍

随着业务规模扩大,单一数据库实例可能无法承载高并发的读写请求或海量数据存储。分库分表是一种通过拆分数据的方式,提升数据库性能和可扩展性的技术。


1.1 拆分策略

分库分表的拆分策略主要分为两种:

垂直拆分
  • 定义:根据业务模块或表的字段进行拆分。
  • 类型:
    1. 垂直分库
      将不同业务模块的表拆分到不同的数据库中。
      适用场景:电商系统中的用户模块和订单模块分布在不同的数据库中。
    2. 垂直分表
      将表中的列拆分为多个表,常用于大字段分离。
      适用场景:将用户表的主信息和扩展信息分成两张表。
水平拆分
  • 定义:根据数据范围或规则对同一张表的数据进行拆分。
  • 类型:
    1. 水平分库
      按数据范围将数据分布到不同的数据库中。
      适用场景:订单数据按用户 ID 或时间拆分到不同的数据库。
    2. 水平分表
      按数据范围将数据分布到多张表中,所有表在同一数据库。
      适用场景 :将订单表按年份拆分为 order_2023order_2024 等。
垂直拆分和水平拆分的区别
拆分类型 核心思想 适用场景 优点 缺点
垂直拆分 按模块或字段拆分 数据库结构较复杂 简化表结构,便于优化 跨库或跨表查询成本较高
水平拆分 按数据范围或规则拆分 单表数据量较大 减少单库压力,提升并发能力 数据路由复杂,事务处理难度增加

2. 分库分表实现技术

实现分库分表需要借助中间件或框架,常见的有 ShardingJDBCMyCat


2.1 ShardingJDBC

简介

ShardingJDBC 是 Java 的数据库分库分表中间件,作为 JDBC 驱动程序嵌入应用程序中,负责数据库分片、读写分离等功能。

作用
  • 数据库分片:支持水平分库和分表。
  • 读写分离:自动路由读写请求到主库或从库。
  • 分布式事务:支持两阶段提交。
实现原理
  • 数据分片规则:通过配置分片键和算法实现数据路由,例如按照用户 ID 取模。
  • 分片执行:将 SQL 请求拆分为多条子查询,并合并查询结果返回。

示例配置:

yml 复制代码
sharding:
  tables:
    order:
      actualDataNodes: db${0..1}.order_${0..1}
      databaseStrategy:
        inline:
          shardingColumn: user_id
          algorithmExpression: db${user_id % 2}
      tableStrategy:
        inline:
          shardingColumn: order_id
          algorithmExpression: order_${order_id % 2}

2.2 MyCat

简介

MyCat 是基于代理的分库分表中间件,通过代理层实现对应用透明化的数据库分片和管理。

作用
  • 支持垂直和水平拆分。
  • 实现主从复制与读写分离。
  • 提供分布式事务支持。
实现原理
  • SQL 解析与路由:解析 SQL 中的分片键,依据配置规则选择目标库或表。
  • 执行与合并:将查询分发到多个分片数据库中,合并结果返回客户端。

示例分片规则:

properties 复制代码
schema.s0.dataNode=dn1,dn2
table.orders.dataNode=dn$->{order_id%2}
table.orders.rule=order_id%2

3. 总结

技术 适用场景 优点 缺点
ShardingJDBC 单体或微服务架构中使用 易于集成,支持多种分片算法和事务处理 与应用强耦合,需修改应用代码
MyCat 分布式架构,数据量超大场景 高性能,支持跨语言和分布式事务 部署复杂,需单独维护代理服务器

通过合理使用分库分表技术,可以有效解决大数据量和高并发问题,为业务提供强大的数据库支撑。

相关推荐
haogexiaole3 小时前
Redis优缺点
数据库·redis·缓存
在未来等你3 小时前
Redis面试精讲 Day 27:Redis 7.0/8.0新特性深度解析
数据库·redis·缓存·面试
新法国菜5 小时前
MySql知识梳理之DML语句
数据库·mysql
老华带你飞5 小时前
校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·校园交友网站
许泽宇的技术分享5 小时前
Text2API与Text2SQL深度对比:自然语言驱动的数据交互革命
数据库·windows·microsoft
两张不够花8 小时前
Shell脚本源码安装Redis、MySQL、Mongodb、PostgreSQL(无报错版)
linux·数据库·redis·mysql·mongodb·postgresql·云计算
Java 码农8 小时前
nodejs 集成mongodb实现增删改查
数据库·mongodb
少陵野小Tommy9 小时前
Python能用古诗词数据库做什么7:根据标题、诗句查找诗歌
开发语言·数据库·python
花花无缺10 小时前
MySQL--B+树
后端·mysql
khystal10 小时前
HUMS 2023齿轮箱数据分析
数据库·数据分析·信号处理