news 2026/4/18 7:52:04

MySQL分区表使用保姆级教程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL分区表使用保姆级教程

分区表是什么

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

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

分区表的优点

  • 更少的数据检索范围
  • 拆分超级大的表,将部分数据加载至内存
  • 分区表的数据更容易维护
  • 分区表数据文件可以分布在不同的硬盘上,并发 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 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);

执行上面的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个分区。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:09:57

macOS虚拟机终极方案:从零到一完整教程与一键转换技巧

还在为macOS虚拟机的各种兼容性问题头疼吗?找不到合适的安装文件?启动总是卡在Apple logo?本文将带你深入解析macOS虚拟机ISO镜像的完整处理流程,手把手教你如何快速构建稳定可用的macOS Catalina/Mojave/High Sierra虚拟机环境。…

作者头像 李华
网站建设 2026/4/11 16:20:57

【2026年精选毕业设计:基于Spring Boot的智慧招聘系统——企业招聘 人才求职一体化平台<br/>(含论文+源码+PPT+开题报告+任务书+答辩讲解)】

2026年精选毕业设计:基于Spring Boot的智慧招聘系统——企业招聘 & 人才求职一体化平台(含论文源码PPT开题报告任务书答辩讲解) 🎯 毕业设计还在做“学生管理系统”?太老套了!2026年最火、最具实战价值…

作者头像 李华
网站建设 2026/4/17 17:28:29

Flutter状态管理实战:从新手到进阶的选型与落地指南

Flutter状态管理实战:从新手到进阶的选型与落地指南 欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。 在Flutter开发中,“状态管理”是贯穿新手到进阶的核心命题,也是决定项目可维护性的关键因素。不少开发…

作者头像 李华
网站建设 2026/4/18 5:35:49

Llama-Factory能否支持联邦学习架构?隐私保护新方向

Llama-Factory 能否支持联邦学习?隐私保护下的大模型微调新路径 在医疗、金融和政务等对数据隐私高度敏感的领域,企业越来越希望利用大语言模型(LLM)提升业务智能化水平。然而,一个现实困境摆在面前:要让模…

作者头像 李华
网站建设 2026/4/18 5:15:18

Qt程序退出:优雅终止vs强制杀死的区别

记忆要点思路&#xff1a;将pkill的信号转换成QCoreApplication::quit();// 示例&#xff1a;捕获SIGTERM并调用QApplication::quit() #include <csignal> #include <QCoreApplication>void signalHandler(int sig) {if (sig SIGTERM) {QCoreApplication::quit();…

作者头像 李华
网站建设 2026/4/18 7:05:03

终极歌单迁移指南:3步轻松将网易云/QQ音乐歌单转至苹果音乐

终极歌单迁移指南&#xff1a;3步轻松将网易云/QQ音乐歌单转至苹果音乐 【免费下载链接】GoMusic 迁移网易云/QQ音乐歌单至 Apple/Youtube/Spotify Music 项目地址: https://gitcode.com/gh_mirrors/go/GoMusic 还在为不同音乐平台间的歌单迁移而烦恼吗&#xff1f;GoMu…

作者头像 李华