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 分布式架构,数据量超大场景 高性能,支持跨语言和分布式事务 部署复杂,需单独维护代理服务器

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

相关推荐
踏月的造梦星球11 分钟前
DMHS同步原理与DM8到DM8基础搭建
数据库·oracle
渣渣灰飞16 分钟前
MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第六章:Redis 实现登录 Token
学习·mysql·缓存
渣渣灰飞24 分钟前
MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第五章:缓存穿透、缓存击穿、缓存雪崩
学习·mysql·缓存
Hardworking66630 分钟前
第6章 数据工程
运维·服务器·数据库·数据工程
Elastic 中国社区官方博客1 小时前
4 个英伟达人工智能任务,1 个 Elasticsearch 接口:嵌入、聊天、completion 和重排序
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai
G.O.G.O.G2 小时前
LeetCode SQL 从入门到精通(MySQL)05(下)
数据库·sql·oracle
其实防守也摸鱼2 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
不能只会打代码2 小时前
Day 002 — Python 工程化 & FastAPI & 数据库速通
数据库·redis·python·docker·fastapi·测试
Rsun045513 小时前
MySQL 中什么是回表?
数据库·mysql
Sylvia33.3 小时前
足球数据接口开发实战:如何用火星数据API盘活赛事应用
java·服务器·开发语言·数据库·python