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

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

//~~

相关推荐
+VX:Fegn089539 分钟前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
哈__2 小时前
KES-Operator重塑Kubernetes环境下的KES数据库集群管理
数据库·kubernetes·operator·kes
IvorySQL4 小时前
IvorySQL 5.6 发布:PG 18.6 内核升级,沙盒即开即用
数据库·人工智能·postgresql
CNSSIRD数据库5 小时前
中国企业环境信用数据库2003-2026
大数据·数据库·数据分析·论文笔记
fd32005 小时前
达梦数据库更新统计信息后仍走旧执行计划解决方案
数据库
百万蹄蹄向前冲6 小时前
密码都对Node.js却连不上Linux数据库
linux·mysql
华章酱6 小时前
MySQL幻读是怎么出现的
数据库·mysql·幻读
浅念-6 小时前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql
updayday8546 小时前
离职域账号状态变更与Ping64操作记录核对
大数据·网络·数据库·安全·智能路由器
aramae6 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他