MySQL普通表转换为分区表实战指南

码到三十五 : 个人主页

引言

本文将详细指导新手开发者如何将MySQL中的普通表转换为分区表。分区表在处理庞大数据集时展现出显著的性能优势,不仅能大幅提升查询速度,还能有效简化数据维护工作。通过掌握这一技巧能够更好地应对数据密集型应用带来的挑战,为系统的高效运行奠定坚实基础。

目录

      • 引言
      • 步骤 1: 备份原始数据
      • 步骤 2: 修改表结构以包含分区键在主键中
      • 步骤 3. 修改原始表以支持分区
      • 步骤 4: 重建表以添加分区
      • 步骤 5: 迁移数据到新表
      • 步骤 6: 验证数据迁移的完整性和准确性
      • 步骤 7: 重命名表(可选)
      • 步骤 8: 测试和监控
      • 步骤 9:创建分区管理存储过程
      • 注意事项

在这里插入图片描述

步骤 1: 备份原始数据

在进行任何结构更改之前,请务必备份原始数据,dump或者sql请选中合适的方式即可。

mysqldump -u [username] -p[password] [database_name] new_table > new_table_backup.sql
CREATE TABLE backup_table_name AS SELECT * FROM original_table_name;

如果数据量不大,可以直接修改表结构即可,可以跳过 3到 7这几步。

步骤 2: 修改表结构以包含分区键在主键中

一般如果根据create_time作为分区建,由于create_time需要成为主键的一部分,我们可以创建一个复合主键,包含原有的idcreate_time字段。

ALTER TABLE original_table_name DROP PRIMARY KEY
add  original_table_name ADD PRIMARY KEY (id, create_time);

如果数据量较大,可以考虑新建表的方式来处理。

步骤 3. 修改原始表以支持分区

需要确定分区策略,比如基于范围、列表、哈希或键进行分区。以下以范围分区为例。

ALTER TABLE original_table_name 
PARTITION BY RANGE (YEAR(create_time)) (PARTITION p0 VALUES LESS THAN (2022),PARTITION p1 VALUES LESS THAN (2023),PARTITION p2 VALUES LESS THAN (2024),...PARTITION pn VALUES LESS THAN MAXVALUE
);

步骤 4: 重建表以添加分区

接下来,我们需要创建一个新的分区表,并将数据从旧表迁移到新表。由于无法直接在当前表上添加分区,我们将创建一个新表,其结构与原表相似,但包含分区定义。

CREATE TABLE new_partitioned_table (id INT NOT NULL,name VARCHAR(50),create_time TIMESTAMP NOT NULL,PRIMARY KEY (id, create_time)
) ENGINE=InnoDB
PARTITION BY RANGE COLUMNS(create_time) (PARTITION p0 VALUES LESS THAN ('2023-01-01'),PARTITION p1 VALUES LESS THAN ('2023-02-01'),PARTITION p2 VALUES LESS THAN ('2023-03-01'),PARTITION future VALUES LESS THAN MAXVALUE
);

步骤 5: 迁移数据到新表

将数据从原始表迁移到新的分区表。

INSERT INTO new_partitioned_table (id, name, create_time) SELECT * FROM original_table_name ;

步骤 6: 验证数据迁移的完整性和准确性

确保所有数据都已正确迁移到新的分区表中,并且没有数据丢失或损坏。

SELECT COUNT(*) FROM original_table_name ; -- 记下这个数量
SELECT COUNT(*) FROM new_partitioned_table; -- 应该与前一个查询的结果相同

步骤 7: 重命名表(可选)

如果希望新的分区表替代原来的表,可以先删除原表,然后将新表重命名为原表的名称。

DROP TABLE original_table_name ;
RENAME TABLE new_partitioned_table TO original_table_name ;

步骤 8: 测试和监控

在应用程序中测试新的分区表以确保其正常工作。监控性能以确保分区提高了查询效率,并定期检查分区的使用情况,以便根据需要调整分区策略。

步骤 9:创建分区管理存储过程

DELIMITER //
CREATE PROCEDURE CreateNextMonthPartition()
BEGINDECLARE v_next_month DATE;DECLARE v_partition_name VARCHAR(255);DECLARE v_alter_sql TEXT;DECLARE v_last_partition_name VARCHAR(255);DECLARE v_last_partition_values VARCHAR(255);-- 获取下个月的第一天SET v_next_month = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y-%m-01');-- 生成新分区的名称SET v_partition_name = CONCAT('p', DATE_FORMAT(v_next_month, '%Y%m'));-- 获取最后一个分区的名称和值,以便在ALTER TABLE语句中使用SELECT PARTITION_NAME, PARTITION_DESCRIPTION INTO v_last_partition_name, v_last_partition_values FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 'new_table' AND TABLE_SCHEMA = DATABASE() ORDER BY PARTITION_ORDINAL_POSITION DESC LIMIT 1;-- 构建ALTER TABLE语句来添加新分区SET v_alter_sql = CONCAT('ALTER TABLE new_partitioned_table  REORGANIZE PARTITION ', v_last_partition_name, ' INTO (','PARTITION ', v_last_partition_name, ' VALUES LESS THAN (', v_last_partition_values, '),','PARTITION ', v_partition_name, ' VALUES LESS THAN (', QUOTE(DATE_FORMAT(DATE_ADD(v_next_month, INTERVAL 1 MONTH), '%Y-%m-01')), ')','PARTITION future VALUES LESS THAN MAXVALUE)',';');-- 执行ALTER TABLE语句PREPARE stmt FROM v_alter_sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;
END //
DELIMITER ;

这个存储过程做了以下几件事情:

  1. 计算下一个月的第一天。
  2. 生成新分区的名称。
  3. 查询当前表的最后一个分区信息。
  4. 构建并执行一个ALTER TABLE语句来重新组织最后一个分区,并添加新的分区。

假设new_partitioned_table已经有一个名为future的分区,其值是VALUES LESS THAN MAXVALUE

注意事项

  1. 备份:在进行任何结构更改之前,请确保你已经备份了原始数据。
  2. 性能测试:在更改表结构后,建议进行性能测试以确保新的分区策略确实提高了性能。
  3. 兼容性:不是所有的MySQL存储引擎都支持分区。例如,MyISAM和InnoDB支持分区,但MEMORY和ARCHIVE等引擎可能不支持。确保你的存储引擎支持分区功能。
  4. 分区键选择:选择合适的分区键非常重要。通常,你应该选择一个经常用于查询条件、且数据分布均匀的字段作为分区键。
  5. 分区数量:分区数量不宜过多,否则可能会影响性能。同时,也不宜过少,否则可能达不到预期的性能提升效果。你需要根据实际情况进行权衡和调整。

关注以下公众号获取更多深度内容,纯干货 !

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

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

相关文章

《编程小白变大神:DjangoBlog带你飞越代码海洋》

还在为你的博客加载速度慢而烦恼?DjangoBlog性能优化大揭秘,让你的网站速度飞跃提升!本文将带你深入了解缓存策略、数据库优化、静态文件处理等关键技术,更有Gunicorn和Nginx的黄金搭档,让你的博客部署如虎添翼。无论你…

解决阿里云的端口添加安全组仍然无法扫描到

发现用线上的网站扫不到这个端口,这个端口关了,但是没有更详细信息了 我用nmap扫了一下我的这个端口,发现主机是活跃的,但是有防火墙,我们列出云服务器上面的这个防火墙list,发现确实没有5566端口 参考&a…

大数据解决方案案例:电商平台日志分析

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

AI作画工具介绍

目录 1.概述 2.Stable Diffusion 2.1.诞生背景 2.2.版本历史 2.3.优点 2.4.缺点 2.5.应用场景 2.6.未来展望 3.Midjourney 3.1.诞生背景 3.2.版本历史 3.3.优点 3.4.缺点 3.5.应用场景 3.6.未来展望 4.总结 1.概述 AI作画工具是一种运用人工智能技术&#xff…

万向节锁死(Gimbal Lock)

Gimbal Lock是一个常见的3D动画问题,主要由旋转顺序引起的。我来详细解释一下它的成因: 在三维空间中,任何旋转都可以分解为绕X,Y,Z三个轴的欧拉旋转(Euler Rotation)。每个轴的旋转是按照一定顺序进行的,比如XYZ或ZYX等。 理论上,通过这三个旋转值的组合,可以达到任意的空间…

require.context()函数介绍

业务需求&#xff1a; 前端Vue项目怎样读取src/assets目录下所有jpg文件 require.context()方法来读取src/assets目录下的所有.jpg文件 <template><div><img v-for"image in images" :src"image" :key"image" /></div> …

代码随想录打卡第一天(补)

数组理论基础&#xff0c;704. 二分查找&#xff0c;27. 移除元素 704. 二分查找 最简单的二分思想的应用&#xff0c;主要锻炼写两种方法 两种方法的区别就是&#xff1a;右指针的每次变化&#xff0c;可能还有就是最后找到目标值后的一个下标到底是什么 二分思想&#xff1…

Python实现Stack

你好&#xff0c;我是悦创。 Python 中的栈结构是一种后进先出&#xff08;LIFO, Last In, First Out&#xff09;的数据结构&#xff0c;这意味着最后添加到栈中的元素将是第一个被移除的。栈通常用于解决涉及到反转、历史记录和撤销操作等问题。在 Python 中&#xff0c;你可…

九、C语言:隐式类型转换(整型提升与算数转换)

一、隐式类型转换 C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度&#xff0c;表达式中的字符和短整型操作数在使用之前被转换为普通整型&#xff0c;这种转换称为整型提升。 二、整型提升 //1.表达式的整型运算要在CPU的相应运算器件内执行&#xff…

I/O 设备与设备控制器

目录 I/O 设备 1. 键盘和鼠标 2. 显示器 3. 磁盘 4. 打印机 5. 网络适配器 设备控制器 1. 数据传输 2. 缓冲管理 3. 中断处理 4. 设备初始化 5. 错误检测与恢复 6. 设备控制器的组成部分 7. 示例图解 内存映像 I/O 原理 优点 实现方式 应用场景 I/O 通道 I…

Nginx 精解:正则表达式、location 匹配与 rewrite 重写

一、常见的 Nginx 正则表达式 在 Nginx 配置中&#xff0c;正则表达式用于匹配和重写 URL 请求。以下是一些常见的 Nginx 正则表达式示例&#xff1a; 当涉及正则表达式时&#xff0c;理解各个特殊字符的含义是非常重要的。以下是每个特殊字符的例子&#xff1a; ^&#xff1…

langchainJS -结构化输出(StructuredOutputParser )

在LangChain的帮助下&#xff0c;我们可以为输出定义模式。StructuredOutputParser 使用定义的名称和描述来分析和构建模型预测的输出。 const productParser StructuredOutputParser.fromNamesAndDescriptions({Name: "Name of The Product",Description: "De…

JS中split的用法

在JavaScript中&#xff0c;split() 方法用于将字符串分割成字符串数组&#xff0c;并返回这个数组。该方法接受一个参数&#xff0c;该参数定义了用于分割字符串的字符或正则表达式。 以下是一些使用 split() 方法的示例&#xff1a; 示例 1&#xff1a;使用字符串作为分隔符…

【笔记2】Python编程:从入门到实践(第2版) - 埃里克·马瑟斯

第二部分 1、外星人入侵 Pygame包 2、数据可视化 Matplotlib 、Plotly 3、Web应用程序 Django 项目1&#xff1a;外星人入侵 第12章&#xff5e;第14章 使用Pygame包来开发一款2D游戏。 它在玩家每消灭一群向下移动的外星人后&#xff0c;将玩家提高一个等级。等级越高&…

spring 事务隔离级别

一、理解 脏读、不可重复读和幻读 脏读、不可重复读和幻读是数据库事务处理中可能出现的三种并发问题&#xff0c;它们都与事务的隔离性有关。下面是这三种现象的简要说明&#xff1a; 1. 脏读&#xff08;Dirty Read&#xff09;: 当一个事务读取了另一个事务尚未提交的更改…

【Python】pandas中的read_excel()和to_excel()函数解析与代码实现

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的&#xff0c;关注过程&#xff08;分析求解问题的步骤&#xff09; 例如&#xff1a;外卖&#xff0c;关注点菜&#xff0c;接单&#xff0c;送单等 C是面向对象的&#xff0c;关注对象&#xff0c;把一件事拆分成不同的对象&…

java之面向对象2笔记

1 接口(interface) 1.1 概述 接口&#xff08;Interface&#xff09;在计算机科学中&#xff0c;特别是在面向对象编程&#xff08;OOP&#xff09;中&#xff0c;是一个重要的概念。它定义了一组方法的规范&#xff0c;但没有实现这些方法的具体代码。接口的主要目的是确保类…

[240610] 5 种 Non-Posix Shell 在 x-cmd 上的支持 | Perl 发布 5.40.0

目录 [TOC](目录)5 种非 Posix SHell - nushell,fish,xonsh,csh,pwshnushellfishxonshcshpwsh Perl 发布 5.40.0核心增强安全性不兼容的变化弃用性能提升模块和编译指示文档诊断配置和编译平台支持内部变化选定的错误修复已知问题先前版本的勘误表致谢报告错误致谢另请参阅 5 种…

SOA的设计模式_3.微服务模式

SOA的架构中&#xff0c;复杂的ESB企业服务总线依然处于非常重要的位置&#xff0c;整个系统的架构并没有实现完全的组件化以及面向服务&#xff0c;它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线&#xff0c;同时SOA的思想进入到单个业…