MYSQL表分區(二)

MYSQL表分區(一)

目錄

1.分區

2.分區定時任務:存儲過程與定時任務

1.存儲過程

2.創建 定時器計劃


目的表:sp_program_playinfo

目的字段:create_time

主鍵 :id

表爲已創建表

查詢當前表是否存在分區

SELECT
	partition_name 
FROM
	information_schema.PARTITIONS 
WHERE
	table_schema = SCHEMA ( ) 
	AND table_name = 'sp_program_playinfo' 
	AND partition_name LIKE 'p2019%';;

1.分區

執行修改分區語句會提示:1503 - A PRIMARY KEY must include all columns in the table's partitioning function

意思是 主鍵必須包含表的分區函數中的所有列所以我們將該列改爲聯合主鍵。

alter TABLE `sp_program_playinfo` PARTITION BY RANGE (TO_DAYS(create_time))
(
 PARTITION p20180601 VALUES LESS THAN (TO_DAYS('20180601')) ENGINE = InnoDB,
 PARTITION p20180701 VALUES LESS THAN (TO_DAYS('20180701')) ENGINE = InnoDB,
 PARTITION p20180801 VALUES LESS THAN (TO_DAYS('20180801')) ENGINE = InnoDB,
 PARTITION p20180901 VALUES LESS THAN (TO_DAYS('20180901')) ENGINE = InnoDB,
 PARTITION p20181001 VALUES LESS THAN (TO_DAYS('20181001')) ENGINE = InnoDB,
 PARTITION p20181101 VALUES LESS THAN (TO_DAYS('20181101')) ENGINE = InnoDB,
 PARTITION p20181201 VALUES LESS THAN (TO_DAYS('20181201')) ENGINE = InnoDB,
 PARTITION p20190101 VALUES LESS THAN (TO_DAYS('20190101')) ENGINE = InnoDB,
 PARTITION p20190201 VALUES LESS THAN (TO_DAYS('20190201')) ENGINE = InnoDB,
 PARTITION p20190301 VALUES LESS THAN (TO_DAYS('20190301')) ENGINE = InnoDB,
 PARTITION p20190401 VALUES LESS THAN (TO_DAYS('20190401')) ENGINE = InnoDB
);

Range() 參數爲目的列所產生的值,TO_DAYS(日期值)是mysql 函數:返回一個天數(從公元0年到目的值的天數);

PARTITION 分區名稱  VALUES LESS THAN (區間值) ENGINE = InnoDB,

由於我的表分區需要定時動態自增,所有上面的語句到了20190401以後就會出錯,因爲20190401以後的時間沒有分配到分區。如果需要進行完整分區可以加上

PARTITION pMaxValue VALUES LESS THAN MAXVALUE

2.分區定時任務:存儲過程與定時任務

1.存儲過程

CREATE DEFINER=`root`@`%` PROCEDURE `autoPartition`(IN table_name VARCHAR(64),OUT theSql VARCHAR(200))
BEGIN
# 目標分區數
DECLARE target_PCount INT DEFAULT -1;

DECLARE newPName VARCHAR(21);

DECLARE target_Date TIMESTAMP;

SET target_Date = DATE_ADD(CURRENT_DATE(),INTERVAL 1 DAY);

SET newPName = DATE_FORMAT( target_Date, 'p%Y%m%d' );

 select COUNT(1) c INTO target_PCount from information_schema.partitions where table_schema = schema() and table_name= table_name AND partition_name =  newPName;

IF target_PCount <= 0 THEN

	SET @createPartitonSQL = CONCAT('ALTER TABLE ',table_name,' add PARTITION( PARTITION ' , newPName,
	' VALUES LESS THAN (TO_DAYS("', target_Date , '")) ENGINE = InnoDB);' );

		PREPARE STMT FROM @createPartitonSQL;
		EXECUTE STMT;
		DEALLOCATE PREPARE STMT;

	SELECT @createPartitonSQL INTO theSql;

END IF;

END

2.創建 定時器計劃

create EVENT `PartitionTest`.`autoCreatePartition_sp_program_playinfo`
ON SCHEDULE
EVERY '7' WEEK STARTS '2019-01-01 00:00:00'
DO call createPartition('sp_program_playinfo') ;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章