MySql分区

一、什么是分区

MySQL分区是一种数据库设计和管理技术,它允许你将表分割成独立的、具有特定规则的存储单元。每个分区可以独立地进行管理,包括备份、恢复和优化。分区的主要目的是提高查询性能、简化维护以及实现数据的更有效管理。

以下是MySQL分区的一些关键概念:

  1. 分区键(Partition Key): 分区键是用于将表数据分割成不同部分的列。分区键的选择通常取决于你的查询模式和数据分布。常见的分区键包括日期、范围、列表等。

  2. 分区类型: MySQL支持多种分区类型,包括范围分区、列表分区、哈希分区等。每种分区类型都有其适用的场景,选择合适的分区类型取决于你的需求。

  3. 分区表的创建: 你可以在创建表的时候指定分区方式,也可以在表已经存在的情况下通过ALTER TABLE语句进行分区。在创建或更改分区表时,你需要指定分区键和每个分区的规则。

  4. 分区操作: 分区表的操作通常包括将数据插入到特定的分区、查询特定分区的数据、合并或拆分分区等。这些操作使得你可以更灵活地管理大量数据。

  5. 性能提升: 使用分区可以显著提高查询性能,特别是在处理大型数据集时。当查询只涉及到特定分区时,数据库引擎只需要扫描相关的分区,而不是整个表。

  6. 数据维护: 分区可以简化备份和恢复操作,因为你可以只备份或恢复特定的分区。此外,对于一些表维护操作,如重建索引,也可以只针对特定分区进行。

分区是一个高级的数据库设计和管理特性,通常在处理大型数据集或者需要高性能查询的情况下使用。在使用分区时,需要考虑好分区键的选择和分区规则,以充分发挥其优势

二、为什么分区

MySQL数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个磁盘放不下,这个时候,我们可以把数据分配到不同的磁盘里面去。

表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

三、分区类型

1、RANGE 分区:
基于属于一个给定连续区间的列值,把多行分配给分区。

2、LIST 分区:
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

3、HASH分区:
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。

4、KEY分区:
类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

5、复合分区:
基于RANGE/LIST 类型的分区表中每个分区的再次分割。子分区可以是 HASH/KEY 等类型。


四、以时间分区为例

1、创建表

该表生成1000万的数据

2、创建分区

要以start_time字段做分区字段,那么start_time必须是主键

alter table alarm_record_year DROP PRIMARY KEY, ADD PRIMARY key(sid, start_time);

分区:按年分区,每年做一个分区

-- 新建,年分区 
ALTER TABLE alarm_record_year 
PARTITION BY RANGE (year(start_time))
(PARTITION p0001 VALUES LESS THAN (2022), -- 2021PARTITION p0002 VALUES LESS THAN (2023), -- 2022PARTITION p0002 VALUES LESS THAN (2024), -- 2023PARTITION p_max VALUES LESS THAN (maxvalue) -- 不属于任何分区的数据 maxvalue是最后一个分区,后面不能再往后加分区
);

解释:值是2022的存的是小于2022年的数据,值是maxvalue存的是不在任何分区中的数据

查询分区

-- 年-查询分区
select partition_name, partition_description as val from information_schema.partitions
where table_name='alarm_record_year' and table_schema='lyc';

3、查询

3.1、查询是否走分区

EXPLAIN SELECT COUNT(1) FROM alarm_record_year WHERE start_time >='2019-01-01' AND start_time < '2019-12-01';

3.2、对比加分区和不加分区的执行时间

没加分区的执行时间(4s)

加分区的执行事件(0.018s)

五、其他操作

1、新建分区

ALTER TABLE alarm_record 
PARTITION BY RANGE (year(start_time))
(PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

2、添加分区

ALTER TABLE alarm_record 
ADD PARTITION
(PARTITION p0003 VALUES LESS THAN (2027)
);

3、修改分区(注意:只能修改最后的一个分区,这样可以变相的新增一个分区

ALTER TABLE alarm_record_year REORGANIZE PARTITION p_max INTO 
( 
PARTITION p0003 VALUES LESS THAN (2024) ,
PARTITION p_max VALUES LESS THAN (MAXVALUE)
);

4、删除分区(注意:删除分区会删除分区内的数据,删除前备份!备份!备份!

-- 删除某个分区
ALTER TABLE alarm_record_year DROP PARTITION p_max;-- 删除全部分区
ALTER TABLE alarm_record REMOVE PARTITIONING;

5、查询分区

select partition_name, partition_description as val from information_schema.partitions
where table_name='alarm_record' and table_schema='lyc';

六、实战:以天为单位分区

生成某个年份到某个年份的所有的日期分区。例如:2020-01-01到2023-12-12

1、创建执行过程

入参:两个年份(2020,2023)

CREATE DEFINER=`root`@`localhost` PROCEDURE `create_day`(IN f_year_start YEAR,IN f_year_end YEAR
)
BEGINDECLARE v_days INT UNSIGNED DEFAULT 365;DECLARE v_year DATE DEFAULT '2020-01-01';DECLARE v_partition_name VARCHAR(64) DEFAULT '';DECLARE v_start_time DATE;DECLARE i,j INT UNSIGNED DEFAULT 1;SET @stmt = '';SET @stmt_begin = 'ALTER TABLE alarm_record_day PARTITION BY RANGE COLUMNS (start_time)(';SET i = f_year_start;WHILE i <= f_year_end DO SET v_year = CONCAT(i,'-01-01');SET v_days = DATEDIFF(DATE_ADD(v_year,INTERVAL 1 YEAR),v_year);        	SET j = 1;WHILE j <= v_days DOSET v_start_time = DATE_ADD(v_year,INTERVAL j DAY);SET v_partition_name = CONCAT('p',i,'_',LPAD(j,3,'0'));SET @stmt = CONCAT(@stmt,'PARTITION ',v_partition_name,' VALUES LESS THAN (''',v_start_time,'''),');SET j = j + 1;        END WHILE;SET i = i + 1;	END WHILE;SET @stmt_end = 'PARTITION p_max VALUES LESS THAN (maxvalue))';SET @stmt = CONCAT(@stmt_begin,@stmt,@stmt_end);PREPARE s1 FROM @stmt;EXECUTE s1;DROP PREPARE s1;SELECT NULL,NULL,NULL INTO @stmt,@stmt_begin,@stmt_end;END

2、执行

CALL create_day('2022','2023');

3、查询所有分区

七、实战:动态生成天的分区

1、创建执行过程

入参:表名+需要保留数据时间(天)

CREATE DEFINER=`root`@`localhost` PROCEDURE `UPDATE_EXCHANGE_TABLE_PARTITION`(in table_name VARCHAR(50), keep_days INT)
BEGINdeclare create_index INT DEFAULT(0);declare create_p_name VARCHAR(100);declare create_p_description VARCHAR(100);declare drop_index INT DEFAULT(0);declare drop_count INT DEFAULT(0);declare drop_date VARCHAR(100); declare drop_p_name VARCHAR(100);set create_p_name = CONCAT('p', DATE_FORMAT(DATE_ADD(now(), INTERVAL 1 DAY), '%Y%m%d'));set create_p_description = DATE_FORMAT(DATE_ADD(now(), INTERVAL 1 DAY), '%Y-%m-%d 23:59:59');set @create_sql = CONCAT('alter table ', table_name, ' add PARTITION (partition ', create_p_name ,' values less than(TO_DAYS(\"', create_p_description ,'\")));');SELECT concat('@create_sql is ', @create_sql);PREPARE stmt_create FROM @create_sql;EXECUTE stmt_create;set drop_date = DATE_FORMAT(DATE_SUB(now(), INTERVAL keep_days DAY), '%Y-%m-%d 23:59:59');SELECT concat('drop_date is ', drop_date);set drop_p_name = CONCAT('p', DATE_FORMAT(DATE_SUB(now(), INTERVAL keep_days DAY), '%Y%m%d'));set @drop_sql = CONCAT('alter table ', table_name, ' drop partition ', drop_p_name);SELECT concat('@drop_sql is ', @drop_sql);PREPARE stmt_drop FROM @drop_sql;EXECUTE stmt_drop;END

2、定时执行函数过程

-- 开启事件
SET GLOBAL event_scheduler = ON;-- 从2012-11-28 00:01:00开始,定时每天执行,执行表为db_data,保留7天的数据
alter EVENT RECEIVE_RECORD_PARTITION_EVENT ON SCHEDULE 
EVERY 1 DAY STARTS '2012-11-28 00:01:00'
DO
begin CALL UPDATE_EXCHANGE_TABLE_PARTITION('db_data', 7);
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/196187.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA 集成 Docker 插件一键部署 SpringBoot 应用

目录 前言IDEA 安装 Docker 插件配置 Docker 远程服务器编写 DockerFileSpringBoot 项目部署配置SpringBoot 项目部署结语 前言 随着容器化技术的崛起&#xff0c;Docker成为了现代软件开发的关键工具。在Java开发中&#xff0c;Spring Boot是一款备受青睐的框架&#xff0c;然…

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

阎良区公益创投之“小飞机大梦想” 航模DIY主题活动

创造是人类探索迈出的第一步&#xff0c;科学是开启奇妙世界的金钥匙。为进一步提升“未来星”对科技知识的兴趣&#xff0c;培养他们的科学创新精神&#xff0c;11月16日&#xff0c;阎良区社会组织公益创投——“未来星”助力乡村留守儿童成长计划项目在阎良区聚宝小学开展“…

【淘宝API】商品详情+搜索商品列表接口

淘宝商品详情API接口可以使用淘宝开放平台提供的SDK或API来获取。这些接口可以用于获取商品的详细信息&#xff0c;如标题、价格、描述、图片等。 以下是使用淘宝开放平台API获取商品详情的步骤&#xff1a; 注册淘宝开放平台账号&#xff0c;并创建应用&#xff0c;获取应用…

【具身智能评估1】具身视觉语言规划(EVLP)仿真环境汇总

参考论文&#xff1a;Core Challenges in Embodied Vision-Language Planning 论文作者&#xff1a;Jonathan Francis, Nariaki Kitamura, Felix Labelle, Xiaopeng Lu, Ingrid Navarro, Jean Oh 论文原文&#xff1a;https://arxiv.org/abs/2106.13948 论文出处&#xff1a;Jo…

C#学习相关系列之Linq常用方法---排序(一)

一、构建数据 public class Student_1{public int ID { get; set; }public string Name { get; set; }public int Chinese { get; set; }public int Math { get; set; }public int English { get; set; }public override string ToString(){return string.Format("ID:{0},…

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…

医院数字化LIS(检验信息系统)源码

临床检验信息管理系统&#xff08;LIS&#xff09;是利用计算机连接医疗设备&#xff0c;通过计算机信息处理技术&#xff0c;将医院检验科或实验室的临床检验数据进行自动收集、存储、处理、提取、传输和交换&#xff0c;满足所有授权用户的功能需求。 一、系统概述 1.LIS&am…

性能测试【第三篇】Jmeter的使用

线程数:10 ,设置10个并发 Ramp-Up时间(秒):所有线程在多少时间内启动,如果设置5,那么每秒启动2个线程 循环次数:请求的重复次数,如果勾选"永远"将一直发送请求 持续时间时间:设置场景运行的时间 启动延迟:设置场景延迟启动时间 响应断言 响应断言模式匹配规则 包括…

Qt QLable 字符过长省略

前言&#xff1a; 项目中常用到字符过长问题&#xff0c;Qt默认的省略并不好用&#xff0c;不是自己想要的&#xff1b; QFontMetri 可使用 QFontMetri 当text的像素宽度超过width&#xff0c;将返回字符串的一个省略版本取决于mode。否则将返回原字符串&#xff1b; mode…

解决STM32F429烧录程序后还需复位才能植入程序的bug

1.打开魔术棒&#xff0c;打开debug 2.打开setting 3.打开Flas Download 4.开启Reset and Run 5.点进去Pack选项页面&#xff0c;去掉enable

postgresql:记录表膨胀引起的io问题的处理

文章目录 1. io异常2.查看profile报告2.1 生成事发时间段的pgprofile2.2 查看报告 3.检查table是否膨胀4.执行vacuum full5.总结 1. io异常 iostat -x 1 20 Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq…

【数据结构】直接插入排序

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码

基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工电场算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工电场优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神…

Stable Diffusion进阶玩法说明

之前章节介绍了Stable Diffusion的入门&#xff0c;介绍了文生图的魅力&#xff0c;可以生成很多漂亮的照片&#xff0c;非常棒 传送门&#xff1a; Stable Diffusion新手村-我们一起完成AI绘画-CSDN博客 那我们今天就进一步讲讲这个Stable Diffusion还能做些什么&#xff0c; …

C语言青蛙爬井(ZZULIOJ1072:青蛙爬井)

题目描述 有一口深度为high米的水井&#xff0c;井底有一只青蛙&#xff0c;它每天白天能够沿井壁向上爬up米&#xff0c;夜里则顺井壁向下滑down米&#xff0c;若青蛙从某个早晨开始向外爬&#xff0c;对于任意指定的high、up和down值&#xff08;均为自然数&#xff09;&…

电脑软件:推荐一款非常实用的固态硬盘优化工具

目录 一、软件简介 二、工作原理 三、功能介绍 3.1、优化SSD设置 3.2、查看驱动器信息 3.3、查看SMART数据 3.4、停用Windows事件日志记录 3.5、禁用Windows碎片整理 3.6、时间戳停用 3.7、禁用引导文件的碎片整理 3.8、关闭短名称 四、使用教程 4.1 安装说明 4.…

滚雪球学Java(09-3):Java中的逻辑运算符,你真的掌握了吗?

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

【算法训练营】参数解析+跳石板

&#x1f308;欢迎来到Python专栏 &#x1f64b;&#x1f3fe;‍♀️作者介绍&#xff1a;前PLA队员 目前是一名普通本科大三的软件工程专业学生 &#x1f30f;IP坐标&#xff1a;湖北武汉 &#x1f349; 目前技术栈&#xff1a;C/C、Linux系统编程、计算机网络、数据结构、Mys…

机器学习的逻辑回归

Sigmoid函数 逻辑回归的预测函数 梯度下降法-逻辑回归 import matplotlib.pyplot as plt import numpy as np # 生成一个关于分类器性能的详细报告。 # 这个报告包含了每个类别的精度、召回率、F1分数&#xff0c;以及所有类别的平均精度、召回率和F1分数 from sklearn.metri…