Mysql分区创建与删除方式

 更新时间:2025年02月11日 09:34:22   作者:Donnedaen  
本文详细介绍了如何在MySQL中创建和删除分区的实例代码,通过实际操作示例,帮助读者理解分区的创建与管理方法,从而更好地优化数据库性能

Mysql分区创建与删除

实例代码

CREATE PROCEDURE `add_table_partition`() 
	COMMENT '增加表分区' 
BEGIN
	/******************************************************************
	*	Creator:	    Donne
	*	Create Date:	2019-05-29
	*	Description:	增加所有表的分区,分区类型为p_date_20190529
                        每月最后一天执行,生成下一个月所有分区
	******************************************************************/
   DECLARE  v_table_name varchar(50);
   DECLARE  v_par_name varchar(20);
   DECLARE i int DEFAULT 0; 
   DECLARE no_more int DEFAULT 0;
   ##将表名和分区名放入游标
   DECLARE cursor_employee CURSOR FOR
   SELECT table_name,max(partition_name)
	 FROM information_schema.partitions 
	WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min'
    GROUP BY table_name;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1;
  ##打开游标
  OPEN cursor_employee;
  FETCH cursor_employee INTO v_table_name,v_par_name;
  ##循环 1:ture, 0:false,!0:ture,!1:false
  ##select 1 from where !0
  WHILE !no_more DO
      my_loop: LOOP
         ##从当前开始
         SET @j:= DATE_ADD(curdate(),INTERVAL i DAY);
         ##下个月最后一天
         SET @end_date:= last_day(DATE_ADD(last_day(curdate()),INTERVAL 1 DAY));
         IF @j > @end_date THEN           
            LEAVE my_loop;
         END IF;
         #计数
         SET i=i+1;
         #分区使用values less than,所以+1 
         SET @par_value:= UNIX_TIMESTAMP(DATE_ADD(curdate(),INTERVAL i DAY));
         SET @par_name:= concat('p_date_',date_format(@j,'%Y%m%d'));
         #如果新建分区大于已有分区,则创建
         IF @par_name>v_par_name THEN
             SET @add_par:= concat('ALTER TABLE ',v_table_name,' ADD PARTITION(PARTITION ',@par_name,' VALUES LESS THAN (',@par_value,'));');
             PREPARE stmt from @add_par;
             EXECUTE stmt;
             DEALLOCATE PREPARE stmt;
         END IF;
      END LOOP;
      #重新计数
      SET i= 0;
      #从游标中取出下一条数据
      FETCH cursor_employee INTO v_table_name,v_par_name;
  END WHILE;
  CLOSE cursor_employee;
END 
CREATE PROCEDURE `drop table partition`(
		in start_date date ,
		in end_date date 
) 
	COMMENT '删除分区' 
BEGIN
	/******************************************************************
	*	Creator:	    Donne
	*	Create Date:	2019-05-29
	*	Description:	删除表分区
	******************************************************************/
   DECLARE  v_table_name varchar(50);
   DECLARE  v_par_name varchar(20);
   DECLARE i int DEFAULT 0; 
   DECLARE no_more int DEFAULT 0;
   ##将表名和分区名放入游标
   DECLARE cursor_employee CURSOR FOR
   SELECT table_name,partition_name
	 FROM information_schema.partitions 
	WHERE table_schema='test' and partition_name is not null and partition_name<>'p_date_min'
      AND partition_name>=concat('p_date_',date_format(end_date,'%Y%m%d'))
      AND partition_name<=concat('p_date_',date_format(end_date,'%Y%m%d'));
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more= 1;
  ##打开游标
  OPEN cursor_employee;
  FETCH cursor_employee INTO v_table_name,v_par_name;
  ##循环
  WHILE !no_more DO
      SET @drop_par:= concat('ALTER TABLE ',v_table_name,' DROP PARTITION ',v_par_name,';');
      PREPARE stmt from @drop_par;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      FETCH cursor_employee INTO v_table_name,v_par_name;
  END WHILE;
  CLOSE cursor_employee;
END 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL复制表的三种方式(小结)

    MySQL复制表的三种方式(小结)

    这篇文章主要介绍了MySQL复制表的三种方式(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 记一次mysql5.7测试数据库被删表的问题

    记一次mysql5.7测试数据库被删表的问题

    这篇文章主要介绍了记一次mysql5.7测试数据库被删表的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • mysql大数据查询优化经验分享(推荐)

    mysql大数据查询优化经验分享(推荐)

    这篇文章主要介绍了mysql大数据查询优化经验分享,真的是正儿八经的mysql优化技巧,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-03-03
  • Mysql8创建用户以及赋权操作过程

    Mysql8创建用户以及赋权操作过程

    文章详细介绍了MySQL 8中创建用户、赋权及权限管理的操作步骤,包括创建不限制IP的用户、赋权数据库所有表、使用WITH GRANT OPTION传递权限、刷新权限、撤销权限、删除用户等,同时强调了权限修改后需刷新及注意权限继承关系
    2025-07-07
  • mysql密码忘记怎么办

    mysql密码忘记怎么办

    mysql密码忘记怎么办?卸载重装?这篇文章主要为大家详细介绍了不卸载也能重新设置密码的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Mysql binlog日志文件过大的解决

    Mysql binlog日志文件过大的解决

    本文主要介绍了Mysql binlog日志文件过大的解决,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • MySQL数据库执行Update卡死问题的解决方法

    MySQL数据库执行Update卡死问题的解决方法

    最近开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果,下面这篇文章主要给大家介绍了关于MySQL数据库执行Update卡死问题的解决方法,需要的朋友可以参考下
    2022-05-05
  • Mysql中条件字段有索引,但使用不了索引的几种场景详解

    Mysql中条件字段有索引,但使用不了索引的几种场景详解

    这篇文章主要介绍了Mysql中条件字段有索引,但使用不了索引的几种场景,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • MySQL两个字段模糊匹配操作方案

    MySQL两个字段模糊匹配操作方案

    这篇文章主要给大家介绍了关于MySQL两个字段模糊匹配操作的相关资料,两张MySQL表进行模糊匹配可以使用like语法来实现,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-09-09

最新评论