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.mzph.cn/news/155004.shtml

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

相关文章

linux控制台命令

进入root sudo su root 浏览当前文件夹列表 ll ls 查看文件 vim test.txt :q 退出查看模式 上传 sudo rz rz 覆盖上传 rz -y 修改文件名&#xff1a; mv 旧文件名 新文件名 修改文件权限 sudo chmod ar xxx.txt sudo chmod 777 test.txt 7 4 2 1 读写运行权限…

flink 1.17.1的pom.xml模板

flink 1.17.1的pom.xml模板 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…

高速数据时代的引领者:ETU-LINK 100G DAC全系列技术简介

伴随科技的不断进步&#xff0c;我们正迅速迈向一个高速数据时代。在这个时代&#xff0c;数据的传输速度已经成为发展的重要因素之一。ETU-LINK推出的100G DAC全系列产品&#xff0c;助力高速数据传输领域的新一轮发展。 一、100G DAC全系列产品解析 100G QSFP28 DAC无源高速…

SQL的连接join

一、连接说明 union、intersect等集合运算&#xff0c;它的特征是以 “行” 为单位进行操作&#xff0c;通俗点说&#xff0c;就是进行这些集合运算&#xff0c;会导致记录行数的增减&#xff0c;使用union会增加记录行数&#xff0c;使用 intersect 或 expect 会减少行记录&a…

后端-锁专题:synchronized(java对象结构、锁的类型、锁升级流程...)

文章目录 对象的结构以及大小内存换算java的常见数据类型以及所占字节数分析对象总共占多少字节&#xff0c;各项占多少字节对象头结构 锁类型锁升级流程 对象的结构以及大小内存换算 java的常见数据类型以及所占字节数 String&#xff1a;8字节 64位 int&#xff1a;4字节 …

【中国大学生计算机设计大赛数据可视化赛道】国奖项目深入剖析—推动乡村振兴可视化分析平台【可视化项目案例-09】

🎉🎊🎉 你的技术旅程将在这里启航! 🚀🚀 本专栏包括但不限于大屏可视化、图表可视化等等。订阅专栏用户在文章底部可下载对应案例源码以供大家深入的学习研究。 🎓 每一个案例都会提供完整代码和详细的讲解,不论你是初学者还是资深开发者,这里都有适合你的内容。…

asp.net勤工助学管理系统VS开发sqlserver数据库web结构c#编程计算机网页项目

一、源码特点 asp.net 勤工助学管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 系统运行视频 https://www.bilibili.com/video/BV1Sz4y1F7GP/ 二、功能介绍 本系统使用Microsoft Visual Studio…

Threejs_10 光线投射技术完成画布三维事件交互

你完成了一个threejs的模型之后&#xff0c;里面有很多东西&#xff0c;你咋知道你点击的是哪个呢&#xff1f;&#xff1f;如何触发你点击的事件呢&#xff1f;再canvas画布中可不能和html事件一样直接使用e.target来完成了哦。如何做到呢&#xff1f; 光线投射实现三维定位 …

查看当前目录文件大小的命令(不含子文件)

1、查看当前目录下文件的大小命令&#xff1a; du -sh * 举例&#xff1a; /root/user下面的文件有&#xff1a;bak&#xff08;10G)、adress(5G&#xff09; 、name&#xff08;3G&#xff09; 三个文件架 使用&#xff1a;du -sh * 结果&#xff1a; 10G bak 5…

自动化物流运输设备模组要选择哪种类型?

在自动化物流运输设备中&#xff0c;选择合适的模组类型取决于具体的运输需求和应用场景。 1、同步带模组&#xff1a;同步带模组是一种低噪音、低成本的物流运输设备&#xff0c;适用于中短距离、轻型货物的运输。它采用同步带传动的方式&#xff0c;具有传动准确、运行稳定、…

安卓老项目改造为AndroidX

由于涉及到了包名的改动&#xff0c;如果从Android Support Library升级到AndroidX需要手动去改每一个文件的包名&#xff0c;那可真得要改死了。&#xff08;*是的我改完才发现这个办法&#xff0c;给我改到深呼吸&#xff0c;气人&#xff01; *&#xff09; 为此&#xff0c…

12 分布式锁加入看门狗

1、看门狗的流程图 2、看门狗的代码实现 /****类说明&#xff1a;Redis的key-value结构*/ public class LockItem {private final String key;private final String value;public LockItem(String key, String value) {this.key key;this.value value;}public String getKey…

CPU架构

CPU架构是指微处理器的设计和实现方式&#xff0c;它决定了处理器的基本运行原理和性能特性。不同的架构适用于不同的应用场景&#xff0c;下面是一些主要的CPU架构类型及其对应的产品&#xff1a; 1. x86/x86-64 架构 描述&#xff1a;最初由 Intel 开发的 x86 架构是目前个…

消消乐游戏开发,消除类游戏

消除游戏是一类简单而又充满乐趣的休闲游戏&#xff0c;通过匹配相同的元素来完成任务&#xff0c;其简单直观的玩法吸引了大量玩家。本文将为你介绍设计和开发一款成功的消除游戏的关键步骤。 1. 确定核心玩法机制 消除游戏的核心在于匹配相同的元素。首先&#xff0c;明确定…

uniapp自定义导航栏返回按键

目录 htmljscss最后 html <!-- #ifdef MP-WEIXIN || APP-PLUS --> <view class"tc header":style"topBarHeight() 0 ? : height: topBarHeight() px;padding-top: topBarTop() px"><view class"reg180" :style"top…

MyBatis Generator 插件 详解自动生成代码

MyBatis Generator&#xff08;MBG&#xff09;是MyBatis和iBATIS的代码生成器。可以生成简单CRUD操作的XML配置文件、Mapper文件(DAO接口)、实体类。实际开发中能够有效减少程序员的工作量&#xff0c;甚至不用程序员手动写sql。 它将为所有版本的MyBatis以及版本2.2.0之后的i…

YOLOV5 C++部署的人员检测项目【学习笔记(十一)】

本文为修改后的转载&#xff0c;没有转载链接&#xff0c;所以文章类型暂为原创 文章目录 一、安装Pytorch 及 YOLO v51.1 安装GPU版 pytorch1.2 安装YOLO v5所需依赖 二、YOLO v5训练自定义数据2.1 标注数据2.1.1 安装labelImg2.1.2 标注 2.2 准备数据集2.2.1 组织目录结构2.…

Python所有常见功能大汇总

以下是Python中常见的语句及其功能。 语句功能import引入模块from…import从某个模块引入指定内容def定义函数if/else条件语句elif多条件判断while循环语句for循环语句break终止循环continue跳过当前循环return指定返回值try/except异常处理with简化文件操作open打开文件read/…

深度学习之三(卷积神经网络--Convolutional Neural Networks,CNNs)

概念 卷积神经网络(Convolutional Neural Networks,CNNs)是一种特殊的神经网络结构,专门用于处理具有网格状结构(如图像、音频)的数据。CNN 在计算机视觉领域取得了巨大成功,广泛应用于图像识别、物体检测、图像生成等任务。以下是 CNN 的主要理论概念: 在数学中,卷…

TeXLive 2023安装教程

TeXLive 2023安装教程 本文介绍最新TeX发行版——TeXLive 2023的安装步骤。如果你想用LaTeX进行写作&#xff0c;那么需要搭建LaTeX环境&#xff1a;可以选择下面两种方案之一进行安装&#xff1a;(1)TeXLive 2023TeXStudio或者(2)TeXLive 2023WinEdt 11。其中TeXLive 2023是由…