mysql表分区

本文简述了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的文档,这里就不啰嗦了。

好了,大家试试,希望能在工作中对你有帮助。

//~~

相关推荐
m0_742566602 分钟前
Mysql下载安装
数据库·mysql
北顾南栀倾寒2 分钟前
[杂学笔记]HTTP1.0和HTTP1.1区别、socket系列接口与TCP协议、传输长数据的时候考虑网络问题、慢查询如何优化、C++的垃圾回收机制
网络·c++·笔记·tcp/ip·mysql·http
搞不懂语言的程序员36 分钟前
数据库事务的 ACID,通过MVCC能做什么
java·开发语言·数据库
爱老的虎油38 分钟前
MySQL零基础教程16—表连接进阶
数据库·mysql
java—大象44 分钟前
基于SpringBoot+mybatis+layui就业管理系统设计和实现
java·数据库·spring boot·后端·layui·mybatis
m0_748233641 小时前
MySQL的底层原理与架构
数据库·mysql·架构
CodeJourney.1 小时前
DeepSeek赋能Power BI:开启智能化数据分析新时代
数据库·人工智能·算法
迅~2 小时前
Linux·数据库INSERT优化
数据库
Stark、2 小时前
【MySQL数据库】SQL语法基础--DQL(入门级)
数据库·sql·mysql
Austindatabases2 小时前
云原生 DB 技术将取代K8S为基础云数据库服务-- 2025年云数据库专栏(一)
数据库·云原生·容器·kubernetes