有一个表tb_3a_huandan_detail,每天有300W左右的数据。查询太慢了,网上了解了一下,可以做表分区。由于数据较大,所以决定做定时任务每天执行存过自动进行分区。
1、在进行自动增加分区前一定得先对表手动分几个区
1 ALTER TABLE tb_3a_huandan_detail PARTITION BY RANGE (TO_DAYS(ServiceStartTime)) 2 ( 3 PARTITION p20160523 VALUES LESS THAN (TO_DAYS(‘2016-05-23‘)), 4 PARTITION p20160524 VALUES LESS THAN (TO_DAYS(‘2016-05-24‘)), 5 PARTITION p20160525 VALUES LESS THAN (TO_DAYS(‘2016-05-25‘)), 6 PARTITION p20160526 VALUES LESS THAN (TO_DAYS(‘2016-05-26‘)), 7 PARTITION p20160527 VALUES LESS THAN (TO_DAYS(‘2016-05-27‘)) 8 )
2、分区存过如下:
1 DELIMITER $$ 2 3 USE `nres`$$ 4 5 DROP PROCEDURE IF EXISTS `create_Partition_3Ahuadan`$$ 6 7 CREATE DEFINER=`nres`@`%` PROCEDURE `create_Partition_3Ahuadan`() 8 BEGIN 9 /* 事务回滚,其实放这里没什么作用,ALTER TABLE是隐式提交,回滚不了的。*/ 10 DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK; 11 START TRANSACTION; 12 13 /* 到系统表查出这个表的最大分区,得到最大分区的日期。在创建分区的时候,名称就以日期格式存放,方便后面维护 */ 14 SELECT REPLACE(partition_name,‘p‘,‘‘) INTO @P12_Name FROM INFORMATION_SCHEMA.PARTITIONS 15 WHERE table_name=‘tb_3a_huandan_detail‘ ORDER BY partition_ordinal_position DESC LIMIT 1; 16 SET @Max_date= DATE(DATE_ADD(@P12_Name+0, INTERVAL 1 DAY))+0; 17 /* 修改表,在最大分区的后面增加一个分区,时间范围加1天 */ 18 SET @s1=CONCAT(‘ALTER TABLE tb_3a_huandan_detail ADD PARTITION (PARTITION p‘,@Max_date,‘ VALUES LESS THAN (TO_DAYS (‘‘‘,DATE(@Max_date),‘‘‘)))‘); 19 /* 输出查看增加分区语句*/ 20 SELECT @s1; 21 PREPARE stmt2 FROM @s1; 22 EXECUTE stmt2; 23 DEALLOCATE PREPARE stmt2; 24 /* 取出最小的分区的名称,并删除掉 。 25 注意:删除分区会同时删除分区内的数据,慎重 */ 26 /*select partition_name into @P0_Name from INFORMATION_SCHEMA.PARTITIONS 27 where table_name=‘tb_3a_huandan_detail‘ order by partition_ordinal_position limit 1; 28 SET @s=concat(‘ALTER TABLE tb_3a_huandan_detail DROP PARTITION ‘,@P0_Name); 29 PREPARE stmt1 FROM @s; 30 EXECUTE stmt1; 31 DEALLOCATE PREPARE stmt1; */ 32 /* 提交 */ 33 COMMIT ; 34 END$$ 35 36 DELIMITER ;
3、增加定时事件
1 DELIMITER || 2 CREATE EVENT Partition_3Ahuadan_event 3 ON SCHEDULE 4 EVERY 15 day STARTS ‘2016-05-27 23:59:59‘ 5 DO 6 BEGIN 7 8 CALL nres.`create_Partition_3Ahuadan`; 9 10 END || 11 DELIMITER ;
参考:
http://blog.csdn.net/m582445672/article/details/7670743
http://blog.chinaunix.net/uid-24086995-id-127389.html
时间: 2024-12-04 20:41:05