当前位置: 首页 > news >正文

MySQL 分库分表

目录
  • MySQL 分库分表(简短版)
    • 一、核心总结
    • 二、实战示例(2 个核心场景,通俗易懂)
      • 示例 1:垂直拆分(无中间件,直接落地)
        • 场景:电商用户表字段过多(60 个字段),高频查询仅 5 个核心字段
        • 实现:纵向分表,拆分为 2 张表
      • 示例 2:水平拆分(Sharding-JDBC 实现,按用户 ID 哈希分表)
        • 场景:订单表(order)已有 1.5 亿条数据,查询缓慢,按 user_id 哈希拆分到 4 张表
        • 实现:基于 Spring Boot + Sharding-JDBC,核心配置+表结构
    • 总结

MySQL 分库分表(简短版)

一、核心总结

当 MySQL 单表数据量超 1000 万条/10G,查询性能急剧下降时,通过分库(拆大库为多个小库)、分表(拆大表为多个小表)分散数据压力,核心分两种方式:

  1. 垂直拆分:按业务/字段拆分(如电商拆用户库、订单库;用户表拆核心表/详情表),实现简单,适合业务隔离。
  2. 水平拆分:按规则(哈希/时间)拆分同一张表的行数据(如订单表按时间拆分为 order_202401、order_202402),从根本解决海量数据问题,需中间件支持。

企业主流方案:水平拆分(哈希规则)+ Sharding-JDBC 中间件

二、实战示例(2 个核心场景,通俗易懂)

示例 1:垂直拆分(无中间件,直接落地)

场景:电商用户表字段过多(60 个字段),高频查询仅 5 个核心字段
实现:纵向分表,拆分为 2 张表
  1. 核心表(高频查询,优先优化索引)
-- 用户核心表(user_core):存储高频查询字段
CREATE TABLE `user_core` (`id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户唯一ID',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`phone` VARCHAR(20) NOT NULL COMMENT '手机号',`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:1正常 0禁用',`create_time` DATETIME NOT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户核心表(高频查询)';
  1. 详情表(低频查询,不建冗余索引)
-- 用户详情表(user_detail):存储低频查询字段,与核心表一对一关联
CREATE TABLE `user_detail` (`user_id` BIGINT PRIMARY KEY COMMENT '用户唯一ID(关联user_core.id)',`address` VARCHAR(200) COMMENT '收货地址',`avatar` VARCHAR(200) COMMENT '头像地址',`remark` TEXT COMMENT '备注信息',`update_time` DATETIME COMMENT '更新时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '用户详情表(低频查询)';
  1. 业务操作示例(查询用户完整信息)
-- 关联查询(仅需用户详情时才查询user_detail,减少高频查询压力)
SELECT c.*, d.address, d.avatar
FROM user_core c
LEFT JOIN user_detail d ON c.id = d.user_id
WHERE c.id = 123456;

示例 2:水平拆分(Sharding-JDBC 实现,按用户 ID 哈希分表)

场景:订单表(order)已有 1.5 亿条数据,查询缓慢,按 user_id 哈希拆分到 4 张表
实现:基于 Spring Boot + Sharding-JDBC,核心配置+表结构
  1. 依赖引入(pom.xml 核心依赖)
<!-- Sharding-JDBC 核心依赖 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.3.2</version>
</dependency>
  1. 配置文件(application.yml,分表规则配置)
spring:shardingsphere:datasource:# 配置单个数据源(分库可配置多个数据源)names: ds0ds0:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/ecommerce?useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456rules:sharding:tables:# 逻辑表名(业务中操作的表名,无需实际创建)t_order:# 实际数据节点:ds0数据源下,t_order_0 到 t_order_3 四张表actual-data-nodes: ds0.t_order_$->{0..3}# 分表规则:按 user_id 哈希取模,分配到不同表table-strategy:standard:sharding-column: user_idsharding-algorithm-name: t_order_inline# 分表算法配置(哈希取模)sharding-algorithms:t_order_inline:type: INLINEprops:# 分片表达式:表索引 = user_id % 4algorithm-expression: t_order_$->{user_id % 4}# 开启 SQL 打印,便于调试props:sql-show: true
  1. 实际表结构(创建 4 张物理表,结构完全一致)
-- 创建物理表 t_order_0(t_order_1、t_order_2、t_order_3 结构完全一致)
CREATE TABLE `t_order_0` (`order_id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '订单唯一ID',`user_id` BIGINT NOT NULL COMMENT '用户ID(分表键)',`order_amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额',`order_status` TINYINT NOT NULL COMMENT '订单状态',`create_time` DATETIME NOT NULL COMMENT '创建时间'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '订单表(物理表0)';
  1. 业务操作示例(Java 代码,操作逻辑表即可,中间件自动路由)
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;// 新增订单(中间件自动按 user_id % 4 路由到对应物理表)public void createOrder(Order order) {orderMapper.insert(order);}// 查询用户订单(中间件自动路由到对应物理表,无需关心分表细节)public List<Order> getOrderByUserId(Long userId) {return orderMapper.selectByUserId(userId);}
}
  1. 效果说明
  • 当 user_id=1001 时,1001 % 4 = 1,数据自动写入 t_order_1
  • 当 user_id=1004 时,1004 % 4 = 0,数据自动写入 t_order_0
  • 业务代码中仅操作 t_order(逻辑表),无需关心底层物理表,实现「透明化」分表。

总结

  1. 垂直拆分适合快速缓解压力,无需中间件,核心是「按业务/字段隔离」;
  2. 水平拆分适合海量数据,核心是「按规则分散行数据」,Sharding-JDBC 是企业主流落地工具;
  3. 示例覆盖「无中间件」和「有中间件」两种场景,可直接对应小型系统和中大型系统的落地需求。
http://www.jsqmd.com/news/338233/

相关文章:

  • 2026年展览展台搭建厂家推荐:重庆觉觅文化传播有限公司,展览制作/活动搭建一站式服务 - 品牌推荐官
  • 家用空气能取暖哪个牌子好?关键看这4 大核心要点! - 资讯焦点
  • 别再当“社会NPC”:Human 3.0 时代的 5 个颠覆性进化指南
  • linux设置永久制表符宽度
  • 使用arc_unpack解包exe教程
  • 2026陕西同城搬家服务指南:如何识别规范企业?五家参考案例解析 - 深度智识库
  • 你的模型真的“学”会了吗?微调效果评估实战指南
  • 2026年智能照明领域实力推荐:东莞商宝照明技术有限公司引领轻智能照明新风尚 - 品牌推荐官
  • Arcgis二次开发--评价单元综合限制级别判断矩阵工具
  • 2026苏州婚纱摄影实力推荐:茜茜公主婚纱摄影,礼服/拍摄/工作室/基地一站式体验 - 品牌推荐官
  • CTF从零到一:新手必备工具合集与下载方式,一键直达!
  • 2026年暖气片/明装暖气/制暖暖气片推荐:美的暖气片全系产品适配多场景供暖需求 - 品牌推荐官
  • Docker:Docker部署Neo4j图数据库
  • 计算机18个专业避坑指南:谁是毕业即高薪的“宝藏”,谁是天坑?
  • 2026旧地面翻新处理厂家推荐:江西祥顺建设有限公司,专注旧地面起尘起砂翻新解决方案 - 品牌推荐官
  • 2026年2月江苏合规网约车/旅游包车/政企定制化租车/代驾包车 /个人租车服务优质企业综合评估与推荐 - 2026年企业推荐榜
  • 2026年定压补水/变频供水/换热机组厂家推荐:威海远大电器制造有限公司全系解决方案 - 品牌推荐官
  • 海报模板 | 学术工具 | 学术海报模板 | 学术会议海报 | 学术会议必备 | 科研展示 | 科研海报 | 国际学术海报 | 会议参会交流 | 科研成果展示 | 海报展示 | 免费下载 | 科研必备
  • 2026年银行助贷服务推荐:甬易融金融科技驱动,助力个人与企业融资需求 - 品牌推荐官
  • 2026年少儿英语教育实力推荐:克拉申阅读表演教育,提供多元英语课程与分级读物 - 品牌推荐官
  • 网络安全究竟防什么?说清网络空间安全的五大重点防护领域
  • 孤能子视角:“智慧交通“
  • 2026年数控系统维修厂家推荐:长沙市晨骏自动化科技有限公司,专业芯片级/主板/驱动器/电源模块维修,适配多品牌数控设备 - 品牌推荐官
  • 2026 上海展厅新标杆:展台设计搭建公司的沉浸式创新与品质答卷 - 资讯焦点
  • 2026年大金中央空调厂家推荐:老房子装暖气、采暖系统、地暖、大金中央空调、家用暖气片、家装暖气片、明装暖气片选择指南 - 优质品牌商家
  • 2026年多媒体/企业/文化/智能/数字/党建/光影展厅推荐:成都经事文化全系定制 - 品牌推荐官
  • 孤能子视角:“智慧物流“
  • 2026年心理咨询机构推荐:湖南明心心理咨询,专注儿童/学生/青少年心理咨询辅导服务 - 品牌推荐官
  • Python 操作 Excel 高阶技巧:用 openpyxl 玩转循环与 Decimal 精度控制
  • 关于单网卡服务器和双网卡服务器路由配置