跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL 分区表使用指南

MySQL 分区表将数据按条件存储在磁盘不同位置,可优化检索范围、减少锁竞争并支持独立备份。适用于单表数据量大且查询性能不足的场景。通过 RANGE 分区示例展示了创建、查询及统计方法,需注意分区列必须包含在主键中且查询需指定分区列等限制。

数字游民发布于 2026/3/22更新于 2026/9/1072 浏览

分区表是什么

分区表就是把一张表的数据,按照设置好的条件,单独存储在磁盘的不同位置,也就是不同分区的数据是独立的,互不影响的。

在没有分区表的情况下,一张表的数据就是存储在一个文件中,用了分区表之后,单张表的数据会在硬盘上分开存储。对表的操作来说,没有什么区别。

分区表的优点

  • 更少的数据检索范围
  • 拆分超级大的表,将部分数据加载至内存
  • 分区表的数据更容易维护
  • 分区表数据文件可以分布在不同的硬盘上,并发 IO
  • 减少锁的范围,避免大表锁表
  • 可独立备份,恢复分区数据

什么时候创建分区表

当单张表的数据量较大,且因为数据量大,导致查询无法满足要求。

不想做分库分表这样大的改动。

未创建分区表的情况

看下如果不创建分区表,查询是怎么样的,可以和创建分区表的情况做对比,这样更好理解。

CREATE TABLE test_partition ( id int(11) NOT NULL, create_time datetime NOT NULL, cyear int, PRIMARY KEY (id,create_time , cyear) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO test_partition VALUES (1,"20130722000000",2013);
INSERT INTO test_partition VALUES (2,"20140722000000",2014);
INSERT INTO test_partition VALUES (3,"20150722000000",2015);
INSERT INTO test_partition VALUES (4,"20160722000000",2016);
INSERT INTO test_partition VALUES (5,"20170722000000",2017);
INSERT INTO test_partition VALUES (6,"20180722000000",2018);
INSERT INTO test_partition  (,"20190722000000",);
 test_partition  (,"20200722000000",);
 test_partition  (,"20210722000000",);
 test_partition  (,"20220722000000",);
VALUES
7
2019
INSERT INTO
VALUES
8
2020
INSERT INTO
VALUES
9
2021
INSERT INTO
VALUES
10
2022

执行上面的 SQL,创建表,并插入记录。

查询年份大于 2016 的记录,语句如下:

文章配图

这个查询,如果想优化,首先想到的就是在年份字段上添加索引,因为年份字段作为查询条件的一个字段。

但实际操作就会发现,添加了索引,最终查询并没有使用这个索引,因为 MySQL 执行器会推断,当结果集的数量占总记录数的比例较大时,不会使用索引,因为无论是否使用索引,扫描的记录总数差不多。

解决方法就是在磁盘的检索范围上进行优化,那就是创建分区表来解决。

分区表的创建

执行下面的语句,可以删除上面创建的表,重新创建带有分区的表。

drop table test_partition;
CREATE TABLE test_partition ( id int(11) NOT NULL, create_time datetime NOT NULL, cyear int, PRIMARY KEY (id,create_time , cyear) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE (cyear) (
 PARTITION y14before VALUES LESS THAN (2014) ,
 PARTITION y15 VALUES LESS THAN (2015) ,
 PARTITION y16 VALUES LESS THAN (2016) ,
 PARTITION y17 VALUES LESS THAN (2017) ,
 PARTITION y18 VALUES LESS THAN (2018) ,
 PARTITION y19 VALUES LESS THAN (2019) ,
 PARTITION y20 VALUES LESS THAN (2020) ,
 PARTITION y20after VALUES LESS THAN maxvalue
);

PARTITION BY RANGE 表示根据字段进行范围分区。

PARTITION 就是分区表的关键字,y15 代表分区的名称,LESS THAN 条件。

当进行数据插入时,年份为 2015 年的数据,就会存储在 y15 这个分区中。年份为 2016 的数据就会存储在 y16 这个分区中。以此类推。

分区表的使用

插入数据

INSERT INTO test_partition VALUES (1,"20130722000000",2013);
INSERT INTO test_partition VALUES (2,"20140722000000",2014);
INSERT INTO test_partition VALUES (3,"20150722000000",2015);
INSERT INTO test_partition VALUES (4,"20160722000000",2016);
INSERT INTO test_partition VALUES (5,"20170722000000",2017);
INSERT INTO test_partition VALUES (6,"20180722000000",2018);
INSERT INTO test_partition VALUES (7,"20190722000000",2019);
INSERT INTO test_partition VALUES (8,"20200722000000",2020);
INSERT INTO test_partition VALUES (9,"20210722000000",2021);
INSERT INTO test_partition VALUES (10,"20220722000000",2022);

可以看到在数据库安装目录的 data 目录中,test 这个文件夹下面有这样一些文件,这就是 test 数据库中 test_partition 表的不同分区数据。文件名称对应的就是表名称 + 分区的名称。

文章配图

在进行查询时,MySQL 会根据查询条件,从指定的分区表中获取数据。这样就缩小了数据的检索范围。

文章配图

查询这个执行计划,可以看到 partitions 字段值就是数据涉及到的分区名称。MySQL 只去查找涉及到的分区,然后从中获取数据,并不会把所有表数据全部去扫描,从物理层面减少扫描范围。

因为查询条件是年份大于 2016,所以只查询 2017 及其之后年份的数据,2017 年的数据存储在 y18 的分区中,所有就可以看到 y18,y19,y20after,这三个分区。

分区表数据统计

通过下面的查询,可以看到表的每个分区中数据分布情况:

SELECT PARTITION_NAME AS "分区", TABLE_ROWS AS "行数" FROM information_schema.partitions WHERE table_schema="test" -- 数据库名称 AND table_name="test_partition"; -- 表名

文章配图

分区表的使用限制

  1. 查询必须包含分区列(上面例子中的 cyear 列),不允许对分区列进行计算。
  2. 分区列必须是数字类型。
  3. 分区表不支持建立外键索引。
  4. 建表时主键必须包含所有的列(上面例子中,PRIMARY KEY (id,create_time , cyear))。
  5. 最多 1024 个分区。

目录

  1. 分区表是什么
  2. 分区表的优点
  3. 什么时候创建分区表
  4. 未创建分区表的情况
  5. 分区表的创建
  6. 分区表的使用
  7. 分区表数据统计
  8. 分区表的使用限制

更多推荐文章

查看全部
  • 接入第三方 OpenAI 兼容模型到 GitHub Copilot
  • JVM 从底层原理到实战调优全维度深度解析
  • 基于实际案例的 AI 大模型应用与提示词工程实践指南
  • Spring Boot 快速构建基于 Spring AI 的智能助手
  • Linux 6.19 ARM64 Crypto SM3 哈希子模块源码分析
  • 数据结构:栈与队列的实现与 OJ 题解析
  • Linux 基础 IO 详解:从 C 标准库到系统调用的底层逻辑
  • 基于 SpringBoot 与 Leaflet 的区域冲突可视化系统设计
  • 开源大语言模型(LLMs)盘点与架构演进
  • Python+AI 入门学习路线与实战代码详解
  • GESP C++二级编程题:小杨的 H 字矩阵
  • 开源 ChatClaw:支持 AI 问答、任务自动化及本地知识库
  • VSCode Copilot 登录失败排查与修复指南
  • Windows 下 Python 新包管理工具 uv 安装与 VSCode 配置
  • VS Code 运行前端代码
  • 基于 YOLO 标注格式的无人机航拍人员搜救检测数据集
  • Linux 指令进阶:从系统本质到常用命令实战
  • OpenClaw 架构原理与落地实战:AI Agent 执行网关底层逻辑
  • FAIR plus 机器人全产业链接会:聚焦具身智能与全球协作
  • 利用闲置 Mac Mini 部署 OpenClaw 构建本地金融 AI 分析助手

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online