网络编程
位置:首页>> 网络编程>> 数据库>> MySQL每天自动增加分区的实现

MySQL每天自动增加分区的实现

作者:Yes,I  发布时间:2024-01-23 16:18:37 

标签:MySQL,自动,增加,分区

有一个表tb_3a_huandan_detail,每天有300W左右的数据。查询太慢了,网上了解了一下,可以做表分区。由于数据较大,所以决定做定时任务每天执行存过自动进行分区。

1、在进行自动增加分区前一定得先对表手动分几个区

ALTER TABLE tb_3a_huandan_detail PARTITION BY RANGE (TO_DAYS(ServiceStartTime))
(
   PARTITION p20160523 VALUES LESS THAN (TO_DAYS('2016-05-23')),
   PARTITION p20160524 VALUES LESS THAN (TO_DAYS('2016-05-24')),
   PARTITION p20160525 VALUES LESS THAN (TO_DAYS('2016-05-25')),
   PARTITION p20160526 VALUES LESS THAN (TO_DAYS('2016-05-26')),
   PARTITION p20160527 VALUES LESS THAN (TO_DAYS('2016-05-27'))
)

2、分区存过如下:

DELIMITER $$

USE `nres`$$

DROP PROCEDURE IF EXISTS `create_Partition_3Ahuadan`$$

CREATE DEFINER=`nres`@`%` PROCEDURE `create_Partition_3Ahuadan`()
BEGIN
/* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/
? ? DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK;
? ? START TRANSACTION;

/* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */
? ? SELECT REPLACE(partition_name,'p','') INTO @P12_Name FROM INFORMATION_SCHEMA.PARTITIONS
? ? WHERE table_name='tb_3a_huandan_detail' ORDER BY partition_ordinal_position DESC LIMIT 1;
? ? ?SET @Max_date= DATE(DATE_ADD(@P12_Name+0, INTERVAL 1 DAY))+0;
/* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */
? ? SET @s1=CONCAT('ALTER TABLE tb_3a_huandan_detail ADD PARTITION (PARTITION p',@Max_date,' VALUES LESS THAN (TO_DAYS (''',DATE(@Max_date),''')))');
? ? /* 输出查看增加分区语句*/
? ? SELECT @s1;
? ? PREPARE stmt2 FROM @s1;
? ? EXECUTE stmt2;
? ? DEALLOCATE PREPARE stmt2;
/* 取出最小的分区的名称,并删除掉 。
? ? 注意:删除分区会同时删除分区内的数据,慎重 */
? ? /*select partition_name into @P0_Name from INFORMATION_SCHEMA.PARTITIONS
? ? where table_name='tb_3a_huandan_detail' order by partition_ordinal_position limit 1;
? ? SET @s=concat('ALTER TABLE tb_3a_huandan_detail DROP PARTITION ',@P0_Name);
? ? PREPARE stmt1 FROM @s;
? ? EXECUTE stmt1;
? ? DEALLOCATE PREPARE stmt1; */
/* 提交 */
? ? COMMIT ;
?END$$

DELIMITER ;

3、增加定时事件

DELIMITER ||
CREATE EVENT Partition_3Ahuadan_event
? ? ? ? ? ON SCHEDULE
? ? ? ? ? EVERY 1 day STARTS '2016-05-27 23:59:59'
? ? ? ? ? DO
? ? ? BEGIN

? ? ? ? ? CALL nres.`create_Partition_3Ahuadan`;

?END ||
DELIMITER ;

参考:

http://blog.csdn.net/m582445672/article/details/7670743

http://blog.chinaunix.net/uid-24086995-id-127389.html

来源:https://www.cnblogs.com/lanceblog/p/5532068.html

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com