MySQL数据库表分区

news2024/11/25 19:19:16

1.背景

当前数据库中,数据库表已经存在,同时该数据库表的数据还在每天不断增长。因为数据库表太大,导致检索过程耗时,为提高检索效率,故对相关数据库表进行分区处理。

2.MySQL分区

分区就是将一个表分解成多个区块进行操作和保存,从而降低每次操作的数据,提高性能。

而对应用来说是透明的,从逻辑上看是只有一个表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是一个独立的对象,可以进行独立处理

四种常见的分区类型:

  • RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。

  • LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。

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

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

3.示例

3.1 RANGE分区

情景:现有hourdb数据库表,想要基于该数据库表的time字段进行分区。
实现:

-- 1.对hourdb表进行分区
-- 分区规则:
-- 2019年及之前
-- 2020年上半年--2020年下半年
-- 2021年上半年--2021年下半年
-- 2022年上半年--2022年下半年
-- 2023年上半年--2023年下半年
-- 2024年上半年--2024年下半年
-- 2025年上半年--2025年下半年
-- 2026年及之后

-- 基于time字段产生time_year_month字段,time_year_month=year*100+month
alter table hourdb add column time_year_month int generated always 
as(year(STR_TO_DATE(time,'%Y-%m-%d %H:%i:%s'))*100+month(STR_TO_DATE(time,'%Y-%m-%d %H:%i:%s'))) 
stored;

-- 创建新的分区表hourdb_partitioned,相比较原hourdb表,增加time_year_month字段
create table if not exists `hourdb_partitioned` (
 `senid` decimal(38,0) comment '传感器点号',
 `time` varchar(255) comment '时标',
 `v` decimal(11,3) comment '整点值',
 `avgv` decimal(11,3) comment '平均值',
 `maxv` decimal(11,3) comment '最大值',
 `maxt` varchar(255) comment '最大值发生时间',
 `minv` decimal(11,3) comment '最小值',
 `mint` varchar(255) comment '最小值发生时间',
 `s` decimal(38,0) comment '整点值标识',
 `avgs` decimal(38,0) comment '平均值标识',
 `maxs` decimal(38,0) comment '最大值标识',
 `mins` decimal(38,0) comment '最小值标识',
 `span` decimal(38,0) comment '计算时段',
 time_year_month int generated always 
 as(year(STR_TO_DATE(time,'%Y-%m-%d %H:%i:%s'))*100+month(STR_TO_DATE(time,'%Y-%m-%d %H:%i:%s'))) stored
)comment '小时数据信息'
partition by range(time_year_month)(
 partition p202000 values less than (202001) comment '2020年之前',
 partition p202001 values less than (202007) comment '2020年上半年',
 partition p202002 values less than (202101) comment '2020年下半年',
 partition p202101 values less than (202107)comment '2021年上半年',
 partition p202102 values less than (202201)comment '2021年下半年',
 partition p202201 values less than (202207)comment '2022年上半年',
 partition p202202 values less than (202301)comment '2022年下半年',
 partition p202301 values less than (202307)comment '2023年上半年',
 partition p202302 values less than (202401)comment '2023年下半年',
 partition p202401 values less than (202407)comment '2024年上半年',
 partition p202402 values less than (202501)comment '2024年下半年',
 partition p202501 values less than (202507)comment '2025年上半年',
 partition p202502 values less than (202601)comment '2025年下半年',
 partition p202511 values less than (maxvalue)comment '2026年及以后'
);

-- 将原数据库数据插入新的数据库
INSERT INTO `hourdb_partitioned`  (`senid`,`time`,`v`,`avgv`,`maxv`,`maxt`,`minv`,`mint`,`s`,`avgs`,`maxs`,`mins`,`span`)
select `senid`,`time`,`v`,`avgv`,`maxv`,`maxt`,`minv`,`mint`,`s`,`avgs`,`maxs`,`mins`,`span` from `hourdb` ;


-- 重命名表
rename table `hourdb` to `hourdb_backup`,`hourdb_partitioned` to `hourdb`;

-- 测试
select count(senid) from `hourdb` partition (p202401);

**注意:**在分区时,一定要按照从小到大的顺序,已经分区的内容将不再参与后续的分区。

3.2 LIST分区
CREATE TABLE `staff_partition_list` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY List (id) (
	PARTITION p0 VALUES in (1,2,3,5),
	PARTITION p1 VALUES in (7,9,10),
	PARTITION p2 VALUES in (11,15)
);

3.3 HASH分区
CREATE TABLE `staff_partition_hash` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY HASH (id)
PARTITIONS 3;

每次插入、更新、删除一行,hash表达式都要计算一次;这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。

3.4 KEY分区
CREATE TABLE `staff_partition_key` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` tinyint(255) DEFAULT NULL,
  `age` int(3) DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
PARTITION BY LINEAR Key (id)
PARTITIONS 3;

4.分区管理

4.1删除分区
alter table staff_partition drop partition p0;

上述语句删除p0分区,同时也会删除p0分区的数据。

 alter table staff_partition remove partitioning;

上述语句只删除p0分区,但是保留了p0分区的数据。

-- 对于hash分区和key分区
alter table staff_partition_hash COALESCE PARTITION 2;

上述命令将当前的分区数量减少到 2 个分区,数据库系统会自动选择哪些分区合并,重新分配数据

4.2增加分区

RANGE和LIST分区

alter table staff_partition add partition(partition p3 values LESS THAN (20));
  • 对于RANGE分区的表,只可以添加新的分区到分区列表的高端
  • 对于List分区的表,不能添加已经包含在现有分区值列表中的任意值

HASH和KEY分区

alter table test_staff_partition_hash add PARTITION partitions 2;
4.3重新分区
ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO 
(partition_definitions)

-- 示例
ALTER TABLE example_table
  REORGANIZE PARTITION p1 INTO (
    PARTITION p1_1 VALUES LESS THAN (100),
    PARTITION p1_2 VALUES LESS THAN (200)
  );
4.4优化分区

如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB,或TEXT类型的列)作了许多修改,可以使用ALTER TABLE ... OPTIMIZE PARTITION来收回没有使用的空间,并整理分区数据文件的碎片。

alter table test_staff_partition OPTIMIZE PARTITION p2,p3;

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

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

相关文章

补充面试知识点

jwt鉴权 实现登录流程 jwt鉴权登录实现步骤(JWT工具类拦截器前端配置)——前后端鉴权方案和使用_jwtsigner-CSDN博客 就是前端每一次刷新页面的时候 都判断一下发来的请求头里边的token信息 通过token识别用户信息和登录状态也就是id 线程池的执行流程 …

Visual Studio2022 Razor格式化慢

菜单:工具-->选项-->文本编辑器-->HTML 设置使用旧版本Razor 为True Razor文件格式化变很快

师生共评作业管理:Spring Boot系统的设计与实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常适…

深入理解 JDK 的 Optional 类

深入理解 JDK 的 Optional 类 深入理解 JDK 的 Optional 类1. 什么是 Optional?1.1 主要构造方法示例 2. Optional 的常用方法2.1 判断值是否存在示例2.2 获取值示例2.3 进行操作示例 3. 使用场景3.1 避免 null 值示例3.2 提高代码可读性3.3 与流结合示例 4. 注意事…

利用C++封装鼠标轨迹算法为DLL:游戏行为检测的利器

在现代软件开发中,鼠标轨迹模拟技术因其在自动化测试、游戏脚本编写等领域的广泛应用而备受青睐。本文将介绍如何使用C语言将鼠标轨迹算法封装为DLL(动态链接库),以便在多种编程环境中实现高效调用,同时探讨其在游戏行…

十一长假!迷你主机小巧便携成为假期新宠。

在十.一国庆长假期间,出游成为许多人的首选活动,你是否已按捺不住内心的悸动,渴望一场说走就走的旅行?但面对繁重的行李与有限的背包空间,如何在享受旅途美景的同时,又不失娱乐与工作的便捷性?今…

Chrome与Firefox浏览器HTTP自动跳转HTTPS的解决方案

一、背景介绍 随着网络安全意识的不断提高,越来越多的网站开始采用HTTPS协议,以确保数据传输的安全性。然而,有时用户在浏览网页时,可能会遇到HTTP请求被自动跳转至HTTPS的情况导致网站打不开,提示安全问题&#xff0…

【Linux】Windows搭建CentOS7环境

【重要提示】在安装CentOS之前,请确保Vmware虚拟机已准备就绪 【准备工作】 一、获取CentOS 7镜像文件 首先,从阿里云的开源镜像站点下载CentOS 7的镜像文件,点击以下链接即可开始下载: 阿里云镜像开源 二、安装VMware Works…

2024年【A特种设备相关管理】模拟试题及A特种设备相关管理作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 A特种设备相关管理模拟试题参考答案及A特种设备相关管理考试试题解析是安全生产模拟考试一点通题库老师及A特种设备相关管理操作证已考过的学员汇总,相对有效帮助A特种设备相关管理作业考试题库学员顺利通…

Could not get JDBC Connection: wait millis 10000, active 500

Could not get JDBC Connection: nested exception is com,alibaba,druid.pool,GetConnectionTimeoutException: wait millis 10000, active 500 1、生产突然出现这样的问题,后经过各种分析查找 jmap -dump:formatb,filewar_l.hporf 10333 ‌jmap -dumpb命令用于生成…

Leetcode 数组中第 k 大的元素

使用最小堆 (min-heap) 来解决该问题 代码逻辑: 初始化最小堆并插入前 K 个元素: 首先,将数组的前 K 个元素插入到堆中。此时,堆的大小为 K,堆顶元素是这 K 个元素中最小的。 遍历剩余的数组元素: 对于数…

VMware ESXi 8.0d 发布下载 - 领先的裸机 Hypervisor

VMware ESXi 8.0d 发布下载 - 领先的裸机 Hypervisor ESXi 8.0 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮) OEM 定制版 请访问原文链接:https://sysin.org/blog/vmware-esxi-8/ 查看最新版。原创作品,转载请保留出处。…

基于Python的程序员薪资数据分析和可视化系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

Detectron2和LSTM进行人体动作识别

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

魅族Lucky 08惊艳亮相:极窄四等边设计引领美学新风尚

在这个智能手机设计趋于同质化的时代,魅族以其独特的设计理念和创新技术,再次为市场带来了一股清新之风。 近日,魅族全新力作——Lucky 08手机正式曝光,其独特的“极窄物理四等边”设计瞬间吸引了众多消费者的目光,而…

国外电商系统开发-运维系统命令记录

在【命令执行】功能中,所有的命令执行记录均被记录到了这里。 关于【状态】的解释: 成功:表示执行命令是正确的,也就是说echo $?的值是0; 失败:表示执行的命令可能是失败的,也可能是服务器的问…

影视飓风得罪了谁?

影视飓风 近日,B 站知名 Up 主「影视飓风」发布了一期视频,名字为《清晰度不如4年前!视频变糊是你的错觉吗?》,但因为背后牵扯的利益太重,最终视频不得已全网下架。 没有第一时间看过视频的你,相…

019 spu、sku 条件检索

文章目录 spuSpuInfoController.javaSpuInfoServiceImpl.java skuSkuInfoController.javaSkuInfoServiceImpl.java 没有做分类检索功能 spu SpuInfoController.java /*** 列表*/RequestMapping("/list")//RequiresPermissions("product:spuinfo:list")pub…

牛客SQL29详解 计算用户的平均次日留存率

牛客SQL29详解 计算用户的平均次日留存率 牛客SQL29详解 计算用户的平均次日留存率 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! 牛客SQL29详解 计算用户的平均次日留存率 题目&#x…

一、安装VMWARE和CentOS

一、安装VMware 1、基本说明 学习Linux需要一个环境,我们需要创建一个虚拟机,然后在虚拟机上安装一个Centos系统来学习 先安装virtual machine 15.5再安装Linux(CentOS 7.6/centos8.1)原理示意图 2、vmware15.5下载 官方地址:https://www.vmware.com/…