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

第十篇:MySQL 实战:数据迁移、分库分表与分区技术指南

随着系统数据量与访问压力的增长,MySQL 单实例常面临性能瓶颈。本篇系统讲解如何进行 数据迁移分库分表分区表设计,并结合实践案例提供完整的优化思路。

一、MySQL 数据迁移方式

1. 场景分类

场景推荐工具
同版本、本地迁移mysqldumpcp+ibdata
跨版本、跨机房迁移mysqldumpmydumperpt-archiver
在线无停机迁移gh-ostPercona XtraBackup、同步复制

2. 使用 mysqldump(适合小型数据)

# 备份数据库
mysqldump -uroot -p mydb > mydb.sql# 迁移目标服务器导入
mysql -uroot -p mydb < mydb.sql

3. 使用 Percona XtraBackup(推荐企业使用)

支持热备份、不锁表,适合大规模数据在线迁移。

xtrabackup --backup --target-dir=/backup/ --datadir=/var/lib/mysql
xtrabackup --prepare --target-dir=/backup/

二、分库分表策略详解

1. 为什么要分库分表?

  • 单表数据量过大(>千万行)导致查询效率下降;

  • 单库连接数、锁竞争瓶颈严重;

  • 提升写入吞吐量与负载均衡能力。

2. 分库 vs 分表

类型说明应用场景
水平分表同库,按主键或时间拆分多个表单表太大
水平分库多库,按用户 ID 分散到不同库访问压力大
垂直分表不同字段拆分存储表字段过多
垂直分库模块拆分,如用户、订单库系统解耦

3. 分表策略示例

-- 按用户 ID hash 分表
CREATE TABLE user_0 (...);
CREATE TABLE user_1 (...);-- 插入数据时
SET @table_id = MOD(user_id, 2);
SET @sql = CONCAT('INSERT INTO user_', @table_id, ' VALUES(...)');
PREPARE stmt FROM @sql;
EXECUTE stmt;

注意: 分表后不支持跨表 JOIN 查询,需借助中间件如 ShardingSphere、MyCat、PolarDB。

 三、MySQL 分区表详解(Partition)

1. 为什么使用分区?

  • 优化大表查询性能;

  • 加快归档与清理;

  • 自动路由 SQL 到指定分区;

  • 支持高效的范围查询、按时间删除等。

2. 分区类型

分区类型描述
RANGE按数值/时间范围
LIST枚举列表分区
HASH按哈希值均匀分布
KEY类似 HASH,自动选择分区函数

3. RANGE 分区示例(按月份)

CREATE TABLE order_log (id BIGINT,create_time DATE
)
PARTITION BY RANGE (YEAR(create_time)*100 + MONTH(create_time)) (PARTITION p202301 VALUES LESS THAN (202302),PARTITION p202302 VALUES LESS THAN (202303),PARTITION pmax     VALUES LESS THAN MAXVALUE
);

4. 分区操作命令

  • 添加新分区:

ALTER TABLE order_log ADD PARTITION ( PARTITION p202304 VALUES LESS THAN (202305) );

  • 删除旧分区(归档或清理):

ALTER TABLE order_log DROP PARTITION p202301;

四、工具链与中间件推荐

工具/平台功能
ShardingSphere分库分表中间件,支持事务、读写分离
MyCat国人开发的分库分表中间件
Canal数据同步/增量迁移利器
gh-ost在线无锁结构变更/迁移
MySQL Fabric官方分库高可用方案(已不推荐)

五、实战:百万级订单表拆分方案

背景

  • 单表超过 500 万订单,查询严重拖慢;

  • 要求按月查询效率高、支持并发写入;

  • 目标:分区表 + 分库备份归档。

方案

  1. 按月 RANGE 分区建表;

  2. 设置自动任务,每月自动添加新分区;

  3. 使用 DROP PARTITION 实现 6 个月外数据自动归档;

  4. 归档数据转存到历史库中。

总结

  • 小规模数据可用 mysqldump 迁移,大数据建议用 XtraBackup

  • 分库分表需考虑分片键、路由策略与查询代价;

  • 分区表可解决部分大表场景,但不适用于高频跨分区操作;

  • 多表多库方案建议配合中间件,简化业务改造。

http://www.lryc.cn/news/2393682.html

相关文章:

  • 【吾爱】逆向实战crackme160学习记录(一)
  • vue2 + webpack 老项目升级 node v22 + vite + vue2 实战全记录
  • opengauss 数据库安装主备 非om方式
  • STM32的HAL编码流程总结(上部)
  • 深度学习|pytorch基本运算
  • (自用)Java学习-5.15(模糊搜索,收藏,购物车)
  • 替代 WPS 的新思路?快速将 Word 转为图片 PDF
  • 【K8S】K8S基础概念
  • FEMFAT许可分析的数据可视化方法
  • 打印机无法远程打印?可以本地打印,本地网络打印机设置给异地使用
  • 包含Javascript的HTML静态页面调取本机摄像头
  • PCB设计实践(三十一)PCB设计中机械孔的合理设计与应用指南
  • deepseek问答记录:请讲解一下torch.full_like()
  • 【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)
  • 多功能秒达开源工具箱源码|完全开源的中文工具箱
  • 如何在腾讯云 OpenCloudOS 上安装 Docker 和 Docker Compose
  • 清理skywalking历史索引
  • 用nz-tabel写一个合并表格
  • matlab计算转子系统的固有频率、振型、不平衡响应
  • leetcode hot100刷题日记——29.合并两个有序链表
  • 【机器人】具身导航 VLN 最新论文汇总 | Vision-and-Language Navigation
  • Windows 安装 WSL2 并运行 Ubuntu 22.04 指南
  • AI情感陪伴在医疗领域的核心应用潜力
  • 【计算机网络】第1章:概述—分组延时、丢失和吞吐量
  • Python Day38
  • DeepSeek R1 模型小版本升级,DeepSeek-R1-0528都更新了哪些新特性?
  • 线路板厂家遇到的PCB元件放置的常见问题有哪些?
  • 【C/C++】无限长有序数组中查找特定元素
  • SQL正则表达式总结
  • 力扣经典算法篇-13-接雨水(较难,动态规划,加法转减法优化,双指针法)