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

MySQL分区表技术:管理海量数据的利器

分区表概述

分区表是将一张逻辑上的大表,按照某种规则分割成多个物理上的小表存储。

分区的优势:
1. 提升查询性能(分区裁剪,只扫描相关分区)
2. 便于数据管理(直接删除旧分区代替DELETE)
3. 分区数据可以分散到不同磁盘
4. 提升维护效率(只需对单个分区做OPTIMIZE等操作)

适用场景:单表数据量超过千万行,且有明显的分区键(时间、地区等)。

注意:分区表不是万能的,对于随机写入的OLTP场景效果有限,更适合OLAP/归档场景。

RANGE分区

RANGE分区按照列值的范围来分区,最常用于时间字段。

-- 按年份分区
CREATE TABLE orders (
id BIGINT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
amount DECIMAL(10,2),
create_time DATETIME NOT NULL,
PRIMARY KEY (id, create_time) -- 分区键必须包含在主键中
) PARTITION BY RANGE (YEAR(create_time)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- 查询时自动分区裁剪
SELECT * FROM orders WHERE YEAR(create_time)=2023; -- 只扫描p2023分区

LIST分区

LIST分区按照列值的离散集合来分区,适合按类别、地区等分区。

-- 按地区分区
CREATE TABLE sales (
id BIGINT NOT NULL,
region_id INT NOT NULL,
amount DECIMAL(10,2),
PRIMARY KEY (id, region_id)
) PARTITION BY LIST (region_id) (
PARTITION p_north VALUES IN (1, 2, 3, 4), -- 华北地区
PARTITION p_south VALUES IN (5, 6, 7, 8), -- 华南地区
PARTITION p_east VALUES IN (9, 10, 11), -- 华东地区
PARTITION p_west VALUES IN (12, 13, 14) -- 华西地区
);

注意:插入的值必须在某个LIST中,否则报错。使用LIST COLUMNS可以支持多列和字符串。

HASH分区和KEY分区

HASH分区通过对分区键取模,将数据均匀分散到指定数量的分区。

-- HASH分区(基于表达式)
CREATE TABLE users (
id INT NOT NULL,
name VARCHAR(50),
PRIMARY KEY (id)
) PARTITION BY HASH(id)
PARTITIONS 8;

-- KEY分区(MySQL内部HASH函数,支持多列)
CREATE TABLE sessions (
session_id VARCHAR(32) NOT NULL,
user_id INT NOT NULL,
data TEXT,
PRIMARY KEY (session_id)
) PARTITION BY KEY(session_id)
PARTITIONS 16;

适用场景:数据无明显范围特征,需要均匀分布。
缺点:无法进行分区裁剪(每次查询需扫描所有分区)。

分区管理操作

-- 添加分区
ALTER TABLE orders ADD PARTITION (
PARTITION p2025 VALUES LESS THAN (2026)
);

-- 删除分区(同时删除该分区数据!)
ALTER TABLE orders DROP PARTITION p2022;

-- 清空分区数据(保留分区结构)
ALTER TABLE orders TRUNCATE PARTITION p2022;

-- 重组分区(合并)
ALTER TABLE orders REORGANIZE PARTITION p2024, p_future INTO (
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION p_future VALUES LESS THAN MAXVALUE
);

-- 查看分区信息
SELECT * FROM information_schema.PARTITIONS
WHERE TABLE_NAME='orders';

分区表的限制与注意事项

MySQL分区表的主要限制:

1. 分区键必须包含在所有唯一键(包括主键)中
2. 分区表不支持外键
3. 全文索引在分区表上不可用
4. 最多支持1024个分区(MySQL 8.0提升至8192)
5. 分区表的查询必须包含分区键才能利用分区裁剪

常见误区:
- 分区不等于索引,两者结合使用效果更佳
- 分区过多反而影响性能(DDL操作更慢)
- 查询条件不包含分区键时会全分区扫描

建议:分区数量控制在100以内,结合业务查询模式设计分区策略。

分区表最佳实践

实践1:时间分区+自动轮转
-- 每月创建新分区,删除12个月前的分区
-- 可通过定时任务自动执行,实现数据自动老化

实践2:利用分区做数据归档
-- 业务数据在主表(分区表),定期将旧分区数据
-- 交换(EXCHANGE PARTITION)到归档表
ALTER TABLE orders EXCHANGE PARTITION p2022 WITH TABLE orders_archive;

实践3:分区+覆盖索引
-- 在分区表的常用查询列上建立覆盖索引
-- 查询既可利用分区裁剪又可利用索引

实践4:监控分区大小
SELECT PARTITION_NAME, TABLE_ROWS,
DATA_LENGTH/1024/1024 AS data_mb
FROM information_schema.PARTITIONS
WHERE TABLE_NAME='orders'
ORDER BY PARTITION_ORDINAL_POSITION;

http://www.jsqmd.com/news/623394/

相关文章:

  • 网安应届生必收藏!3 类岗位薪资 10W~50W,技能要求 + 适配人群全总结
  • EQ参数整定实战:从理论到代码实现的完整指南
  • 3D视频转2D播放的终极指南:用VR-Reversal免费享受沉浸式观影
  • MySpeed 自建测速服务器:群晖用户本地网络监控方案
  • Graphormer效果展示:不同SMILES写法(同分异构体)对预测稳定性验证
  • 一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API瞎
  • fre:ac音频转换器:从CD到MP3的完整音乐库管理方案
  • HUSTOJ:30分钟搭建你自己的开源在线评测系统
  • ROS2通信选型指南:Fast DDS vs Cyclone DDS,从安装配置到性能实测全解析
  • ThinkPad X1 Tablet Gen3键盘Type-C键线分离改造实战
  • SAP MASS批量修改库存仓位实战:从Excel导入到字段匹配的完整流程
  • IndexTTS2终极指南:为什么这款开源语音合成工具值得你立即尝试?
  • HunyuanVideo-Foley开源大模型部署:GPU算力高效利用与显存优化技巧
  • 12年坚守超耐热赛道,京尚凭实力拿下材料优势领跑酒店砂锅新赛道
  • 结对编程
  • 2024深度解析:IP-Adapter与ControlNet在Stable Diffusion中的协同创作指南
  • 别再为PDF预览发愁了!用uniapp + pdf.js搞定H5端Base64格式PDF在线预览(附完整代码)
  • 实战分享:Java如何通过HTTP API调用通用物体识别-ResNet18服务
  • 项目实战(18)-POE分离器设计与应用详解
  • 哔哩下载姬深度体验:重新定义B站视频下载的智能解决方案
  • DPO微调总让模型“信心不足”?可能是“挤压效应”在捣鬼,试试这个SFT阶段的小技巧
  • 【AI】RAG技术原理与流程总结
  • WSL2子系统下高效管理sshd服务的两种实用方案
  • Python-for-Android深度解析:现代Python跨平台移动应用开发架构设计
  • 别再傻傻分不清!一张图看懂EtherCAT从站Startup list和CoE-online的核心差异与应用选型
  • 保姆级教程:在最新版IDEA中为若依前后端分离项目添加新模块(附POM文件修改全流程)
  • MPU6050 DMP姿态解算与Python上位机3D可视化实战(附源码)
  • 微雨雷达——Python数据解析到物理量反演全流程
  • Hive3.1.3版本安装与配置全攻略:从零搭建离线数据仓库
  • Z-Image-Turbo-rinaiqiao-huiyewunv效果实测:连续生成50张不崩溃的显存稳定性压力测试