mysql表分区存储过程

本文为博主原创,未经允许不得转载:

  由于数据库一张表数据量有几千万条,而且在不断增长,看见公司前辈写了一个创建表分区的存储过程,感觉

甚是牛逼,在此供自己保留学习。

/*PROCEDURE create_partition_by_month*/
DROP PROCEDURE IF EXISTS `create_partition_by_month`;
DELIMITER $$
CREATE PROCEDURE `create_partition_by_month`(IN_TABLENAME VARCHAR(64))
BEGIN
    DECLARE ROWS_CNT INT UNSIGNED;
    DECLARE EXPIRE_ROWS_CNT INT UNSIGNED;
    DECLARE BEGINTIME TIMESTAMP;
    DECLARE ENDTIME TIMESTAMP;
    DECLARE PARTITIONNAME VARCHAR(16);
    DECLARE PARTITIONRANGE INT UNSIGNED;
    DECLARE EXPIRETIME TIMESTAMP;
    DECLARE EXPIREPARTITION VARCHAR(16);
    
    SET BEGINTIME = DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL 1 DAY + INTERVAL 1 MONTH);
    SET PARTITIONNAME = DATE_FORMAT( BEGINTIME, 'p%Y%m' );
    SET ENDTIME = DATE(NOW() - INTERVAL DAY(NOW()) DAY + INTERVAL 1 DAY + INTERVAL 2 MONTH);
    SET PARTITIONRANGE = extract(YEAR_MONTH FROM ENDTIME);
    SET EXPIRETIME = DATE(NOW() - INTERVAL 3 YEAR);
    SET EXPIREPARTITION = DATE_FORMAT( EXPIRETIME, 'p%Y%m' );
    
    SELECT COUNT(*) INTO ROWS_CNT FROM information_schema.partitions WHERE  table_name = IN_TABLENAME AND partition_name = PARTITIONNAME;
    IF ROWS_CNT = 0 THEN
        SET @SQL = CONCAT( 'ALTER TABLE `', IN_TABLENAME, '`',
        ' ADD PARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', PARTITIONRANGE ,') ENGINE = InnoDB);' );
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
    ELSE
        SELECT CONCAT("partition `", PARTITIONNAME, "` for table `", IN_TABLENAME, "` already exists") AS result;
    END IF;
    
    SELECT COUNT(*) INTO EXPIRE_ROWS_CNT FROM information_schema.partitions WHERE  table_name = IN_TABLENAME AND partition_name = EXPIREPARTITION;
    IF EXPIRE_ROWS_CNT = 0 THEN
          SELECT CONCAT("partition `", EXPIREPARTITION, "` for table `", IN_TABLENAME, "` not exists") AS result;
    ELSE
          SET @SQL = CONCAT( 'ALTER TABLE `', IN_TABLENAME, '`', ' DROP PARTITION ', PARTITIONNAME, ';' );
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
    END IF;
    
END$$
DELIMITER ;
/*EVENT e_alarm_partition*/
DROP EVENT IF EXISTS `e_alarm_partition`;
DELIMITER $$
CREATE EVENT IF NOT EXISTS `e_alarm_partition`
ON SCHEDULE EVERY 1 DAY   #执行周期,还有天、月等等
STARTS '2017-12-23 04:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Creating partitions'
DO BEGIN
    CALL create_partition_by_month('tbl_alarminfo');
    CALL create_partition_by_month('tbl_user_log');
END$$
DELIMITER ;

SET GLOBAL group_concat_max_len=102400;
SET SESSION group_concat_max_len=102400;
tbl_alarminfo为告警信息表,tbl_user_log为日志操作记录表
posted @ 2018-05-04 16:56  香吧香  阅读(826)  评论(0编辑  收藏  举报