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

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

相关推荐
pele几秒前
如何解决多线图中线条颜色不渲染(仅标记和提示框显示颜色)的问题
jvm·数据库·python
银河系的一束光几秒前
net start mysql 服务名无效。 请键入 NET HELPMSG 2185 以获得更多的帮助
数据库·mysql
untE EADO1 分钟前
MySQL错误-this is incompatible with sql_mode=only_full_group_by完美解决方案
android·sql·mysql
forEverPlume3 分钟前
golang如何排查大量goroutine性能问题_golang大量goroutine性能排查详解
jvm·数据库·python
2401_883600255 分钟前
Golang怎么CGO交叉编译_Golang如何在交叉编译时处理CGO依赖问题【避坑】
jvm·数据库·python
Irene199112 分钟前
(课堂笔记)SQL基础语法分类总结表
数据库·sql
西北奇妙的八角21 分钟前
mysql大表结构变更导致主从延迟问题复盘
mysql
你觉得脆皮鸡好吃吗27 分钟前
SQL注入 手工注入
网络·数据库·sql·安全·web安全·网络安全学习
dishugj33 分钟前
psql-客户端工具日常使用命令整理
数据库·postgresql
m0_7375393736 分钟前
数据库主从复制和读写分离
数据库·oracle