本文简述了mysql表分区的作用和特点,又演示了mysql表分区的创建过程,详细演示了指定不同分区目录时的处理办法。由于表分区对crud操作是透明的,对于普通开发同学其实不用过多关注,但是本着学习的态度,在分库分表等高大上的技术面前,mysql分区技术依然是一个不可或缺的提升数据库读写能力的关键技术。
1、mysql分区的简单介绍
mysql分区就是将表的数据按照特定规则存放在不同的区域,也就是将表的数据文件分割成多个小块,在查询数据的时候,只要知道数据数据存储在哪些区域,然后直接在对应的区域进行查询,不需要对表数据进行全部的查询,提高查询的性能。同时,如果表数据特别大,一个磁盘磁盘放不下时,我们也可以将数据分配到不同的磁盘去,解决存储瓶颈的问题,利用多个磁盘,也能够提高磁盘的IO效率,提高数据库的性能。
1.1、mysql表分区的特点
- 物理存储与逻辑分割:逻辑上数据的crud用户感觉不出表分区的存在,物理上数据按照分区键被分配到不同的分区里。
- 查询性能提升:查询时,mysql能够确定读取那些分区的数据,不用全表扫描。
- 数据管理与维护:分区可以独立备份、恢复,无需对整表操作。
- 扩展性与并行处理:当表的大小超过单个存储设备的容量时,很容易扩展到多个存储设备。
1.2、分区的类型
- RANGE:基于列的值范围将数据分配到不同的分区。比如可以根据日期范围将数据分配到不同的月份、年份的分区中。
- LIST:基于列的离散值集合来分配数据的。对应的列的数据是一个类似枚举型的数据。
- HASH:根据用户指定的列的hash值分配数据。
- KEY:类似于HASH,但支持多列。
大家对先表分区有个认识后,下面咱们就开始实操一下。
2、操练
2.1、创建表分区
sql
create table t_member(
member_id int not null,
member_name varchar(60),
member_phone varchar(20),
create_time datetime,
update_time datetime
) PARTITION BY RANGE (YEAR(create_time)) (
PARTITION P1 VALUES LESS THAN (2024),
PARTITION P2 VALUES LESS THAN (2025),
PARTITION P3 VALUES LESS THAN MAXVALUE
);
不多解释了,sql语句还是比较容易理解。上面我创建了3个分区,咱们到服务器上看看数据文件,如下图:

目前是在一个目录中,如果你的系统有多个硬盘,把数据文件分别放在不同的硬盘上,那肯定会提高读写性能。下面咱们模拟一下过程。因为有些坑大家要避免。
2.2、创建表分区,使用不同的数据目录
我们从一个简单的创建sql开始。
sql
create table t_member32(
member_id int not null,
member_name varchar(60),
member_phone varchar(20),
create_time datetime,
update_time datetime
) PARTITION BY RANGE (YEAR(create_time)) (
PARTITION P1 VALUES LESS THAN (2024) DATA DIRECTORY = '/home/jackie',
PARTITION P2 VALUES LESS THAN (2025) DATA DIRECTORY = '/mydata',
PARTITION P3 VALUES LESS THAN MAXVALUE
);
其实就是在刚才的sql的基础上(表名改了),为三个分区分配了三个不同的目录。p1、p2指定,p3明确指定存放目录,那就是保存在默认的目录里。
直接执行肯定会报错,因为p1、p2目录mysql不知道,要先让mysql知道这两个目录,也就是说不能随便指定一个操作系统的目录。下来咱们处理这个问题。
2.2.1 配置my.cnf
在my.cnf,找到"mysqld"段,加入下面配置(我就按上面sql写了):
注意:多个目录";"号分割。保存后重启mysql,依然报错。还没完,咱们继续。
2.2.2 将目录的owner设置成mysql
管理员登录,设置/home/jackie和/mydata的owner。你的机器上要是还没有这两个目录就先新建一下。
bash
chown mysql:mysql /home/jackie
chown mysql:mysql /mydata
此时还不行,执行刚才的sql语句时,会报存储引擎错误。
2.2.3、配置apparmor
apparmor是linux的一个安全组件,有兴趣大家去查查。咱们修改apparmor的配置:
bash
sudo vim /etc/apparmor.d/usr.bin.mysqld
添加如下配置:

保存退出后,重新加载apparmor配置并重启,命令如下:
bash
sudo systemctl reload apparmor.service
sudo systemctl restart apparmor.service
再次执行上面的创建语句,就能执行成功了。数据文件也按我们的规划放到了指定的区域。

这是/home/jackie目录的数据文件。其他的普通sql操作就不演示了,和普通表的操作一模一样。如果要在分区后继续新增分区、删除分区、合并分区大家可以看看mysql的文档,这里就不啰嗦了。
好了,大家试试,希望能在工作中对你有帮助。
//~~