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()
BEGIN
    DECLARE 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. 分区数量:分区数量不宜过多,否则可能会影响性能。同时,也不宜过少,否则可能达不到预期的性能提升效果。你需要根据实际情况进行权衡和调整。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Bazel入门与精通】 rules之属性

https://bazel.build/extending/rules?hlzh-cn#attributes Attributes An attribute is a rule argument. Attributes can provide specific values to a target’s implementation, or they can refer to other targets, creating a graph of dependencies. Rule-specifi…

【会议推荐|权威主办】2024年人工智能和机械技术应用国际学术会议 (AIMTA 2024)

2024年人工智能和机械技术应用国际学术会议 (AIMTA 2024) 2024 International Academic Conference on Artificial Intelligence and Mechanical Technology Applications 【大会信息】 大会地点:西安 大会官网:http://www.icaimt…

springCloudAlibaba之服务熔断组件---sentinel

sentinel组件学习 sentinel学习sentinel容错机制使用代码方式进行QPS流控-流控规则初体验使用SentinelResource注解进行流控 通过代码方式设置降级规则-降级规则初体验sentinel控制台部署客户端整合服务端 springcloud整合sentinelQPS流控规则并发线程数-流控规则BlockExceptio…

kettle从入门到精通 第六十七课 ETL之kettle 再谈kettle阻塞,阻塞多个分支的多个步骤

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群,一起学习,共同进步。由于群内人员较多无法直接扫描进入,公众号后台加我微信入群,备注kettle。 场景:ETL沟通交流群内有小伙伴反馈,如何多个分支处理完…

QT 使用资源文件的注意点

不要存放没有使用的资源文件 即使在代码中没有使用到的资源文件,也会编译到执行文件或者DLL里面去这样会增大它的体积。如下 在代码没有使用这个资源文件(10.4M的2k图片),但是编译出来的程序有 12M左右的大小 1 假设我们有一个比较复杂的项目&#…

vAttention:用于在没有Paged Attention的情况下Serving LLM

文章目录 0x0. 前言(太长不看版)0x1. 摘要0x2. 介绍&背景0x3. 使用PagedAttention模型的问题0x3.1 需要重写注意力kernel0x3.2 在服务框架中增加冗余0x3.3 性能开销0x3.3.1 GPU上的运行时开销0x3.3.2 CPU上的运行时开销 0x4. 对LLM服务系统的洞察0x5…

【UML用户指南】-13-对高级结构建模-包

目录 1、名称 2、元素 3、可见性 4、引入与引出 用包把建模元素安排成可作为一个组来处理的较大组块。可以控制这些元素的可见性,使一些元素在包外是可见的,而另一些元素要隐藏在包内。也可以用包表示系统体系结构的不同视图。 狗窝并不复杂&#x…

《python程序语言设计》2018版第5章第35题求完全数,解题经历,我认为的正确代码放在最后

5.35从4月开始一直到成功,此文章将所有的记录和不同阶段代码展现给大家。但是没有配图,我最后成功的代码放在了最后。 2024.04.15 05.35.01version 求完整数,这个让我突然有点蒙。我什么时候能求完整数呢?? 正因子之和…

linux 网桥学习

前言: 本文来学习一下linux网桥概念和网桥配置 1. linux网桥概念 网桥,类似于中继器,连接局域网中两个或者多个网段。它与中继器的不同之处就在于它能够解析它收发的数据,读取目标地址信息(MAC)&#xff…

QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite用法

使用QSqlDatabase、QSqlQuery、QSqlRecord、Sqlite数据库实现一个简单的界面查询 1. 创建Sqlite数据库,表 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include "QSqlDatabase" #include "QSqlQuery&q…

ICRA 2024:北京工业大学马楠教授联合中科原动力公司推出番茄采摘自主机器人AHPPEBot,实现32.46秒快速准确采摘

当前,农业生产正深受劳动力短缺困扰,这一现状对生产规模的进一步拓展构成了严重制约。为了突破这一瓶颈,实施自动化已成为提升农业生产力的关键途径,这也使得机器人采收技术备受关注。 现今的机器人采收系统普遍采用先进感知方法&…

31-捕获异常(NoSuchElementException)

在定位元素的时候,经常会遇到各种异常,遇到异常又该如何处理呢?本篇通过学习selenium的exceptions模块,了解异常发生的原因。 一、发生异常 打开百度搜索首页,定位搜索框,此元素id"kw"。为了故意…

我的mybatis学习笔记之二

第一版学习笔记 1,接口是编程: 原生: Dao > DaoImpl mybatis: Mappper > XXXMapper.xml 2,SqlSession代表和数据库的一次会话:用完必须关闭 3,SqlSession和connection一样是非线程安全的.每次使用都必须去获取新的对象 4,mapper接口没有是一类,但是mybtis会为这个接口生…

JVisuaIVM监控Jstatd启动时报错

一、 启动监控Jstatd报错 当我们在windows系统上面启动的时候好好的,在linux上面启动报错,提示报错如下,好像每一什么权限之类的 在tomcat下面查看你的项目使用的java版本,vi /usr/local/tomcat7-8083/bin/catalina.sh 查看我的…

域内攻击 ----> DCSync

其实严格意义上来说DCSync这个技术,并不是一种横向得技术,而是更偏向于权限维持吧! 但是其实也是可以用来横向(配合NTLM Realy),如果不牵强说得话! 那么下面,我们就来看看这个DCSyn…

基于AI大文本模型的智慧对话开发设计及C#源码实现,实现智能文本改写与智慧对话

文章目录 1.AI 大模型发展现状2.基于AI服务的智慧对话开发2.1 大模型API选择2.2 基于C#的聊天界面开发2.3 星火大模型API接入2.4 优化开发界面与显示逻辑 3.源码工程Demo及相关软件下载参考文献 1.AI 大模型发展现状 端午假期几天,关注到国内的AI大模型厂商近乎疯狂…

时序数据库是Niche Market吗?

引言 DB-Engines的流行程度排行从其评估标准[4]可以看出完全不能够做为市场规模的评估标准。甚至于在知道市场规模后可以用这个排行作为一个避雷手册。毕竟现存市场小,可预见增长规模小,竞争大,创新不足,那只能卷价格&#xff0c…

冲刺面试加油

1、HTML语义化? 对于开发者而言,语义化标签有着更好的页面结构,有利于代码的开发编写和后期的维护。 对于用户而言,当网络卡顿时有良好的页面结构,有利于增加用户的体验。 对于爬虫来说,有利于搜索引擎的…

你还不知道无线PLC?

随着技术的不断发展,工业控制系统也在经历着革新。无线PLC(Programmable Logic Controller,可编程逻辑控制器)是一种结合了无线通讯技术和传统PLC系统的创新型技术。它为工业自动化提供了一种更灵活、更便捷的解决方案&#xff0c…

跟我学,数据结构和组原真不难

我个人认为408中计算机组成原理和数据结构最难 难度排行是计算机组成原理>数据结构>操作系统>计算机网络。 计算机组成原理比较难的原因是,他涉及的硬件的知识比较多,这对于大家来说难度就很高了,特别是对于跨考的同学来说&#x…