Mysql 程序分区 table
Mysql Procedure Partitioning table
我不知道为什么我的脚本不起作用!!!
我开发了划分 tables 的程序。我已经 运行 使用调度程序的过程,但没有创建分区。
我想在程序中每月使分区 table 与变量 months_future 一样多。
因此我使用了 'while'.
有没有人能帮帮我??
有程序。
DELIMITER $$
DROP PROCEDURE IF EXISTS CreatePartitions $$
-- Procedure to delete old partitions and create new ones based on a given date.
-- enough new partitions will be made to cover until (today_date + days_future)
CREATE PROCEDURE CreatePartitions (dbname TEXT, tblname TEXT, months_future INT)
BEGIN
DECLARE curdate date;
DECLARE newpart_date date;
DECLARE partition_table_name varchar(50);
DECLARE i INT;
SELECT CURDATE()
INTO curdate;
SELECT 1 INTO i;
WHILE(i <= months_future)
DO
SET partition_table_name = CONCAT('p_',CAST(((curdate + INTERVAL i MONTH)+0) as char(6)));
IF NOT EXISTS (
SELECT *
FROM information_schema.PARTITIONS
WHERE TABLE_NAME=tblname
AND TABLE_SCHEMA=dbname
AND PARTITION_NAME = partition_table_name
)
THEN
SET @sql := CONCAT('ALTER TABLE '
, tblname
, ' ADD PARTITION (PARTITION '
, partition_table_name
, ' VALUES LESS THAN ('
,'\''
, DATE_FORMAT(DATE_ADD(curdate, INTERVAL i + 1 MONTH), '%Y%m01')
,'\''
, '));');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
不要建立超过一个未来的分区;它减慢了速度。只需在需要前一天为下个月构建分区即可。同时保留一个 future
分区,以防处理无法及时构建分区。
更多讨论在这里:http://mysql.rjweb.org/doc.php/partitionmaint
请注意,每月分区的唯一用途是如果您打算通过快速 DROP PARTITION
代替慢速 DELETE
来清除“旧”数据。
我不知道为什么我的脚本不起作用!!! 我开发了划分 tables 的程序。我已经 运行 使用调度程序的过程,但没有创建分区。
我想在程序中每月使分区 table 与变量 months_future 一样多。 因此我使用了 'while'.
有没有人能帮帮我??
有程序。
DELIMITER $$
DROP PROCEDURE IF EXISTS CreatePartitions $$
-- Procedure to delete old partitions and create new ones based on a given date.
-- enough new partitions will be made to cover until (today_date + days_future)
CREATE PROCEDURE CreatePartitions (dbname TEXT, tblname TEXT, months_future INT)
BEGIN
DECLARE curdate date;
DECLARE newpart_date date;
DECLARE partition_table_name varchar(50);
DECLARE i INT;
SELECT CURDATE()
INTO curdate;
SELECT 1 INTO i;
WHILE(i <= months_future)
DO
SET partition_table_name = CONCAT('p_',CAST(((curdate + INTERVAL i MONTH)+0) as char(6)));
IF NOT EXISTS (
SELECT *
FROM information_schema.PARTITIONS
WHERE TABLE_NAME=tblname
AND TABLE_SCHEMA=dbname
AND PARTITION_NAME = partition_table_name
)
THEN
SET @sql := CONCAT('ALTER TABLE '
, tblname
, ' ADD PARTITION (PARTITION '
, partition_table_name
, ' VALUES LESS THAN ('
,'\''
, DATE_FORMAT(DATE_ADD(curdate, INTERVAL i + 1 MONTH), '%Y%m01')
,'\''
, '));');
SELECT @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
SET i = i + 1;
END WHILE;
END $$
DELIMITER ;
不要建立超过一个未来的分区;它减慢了速度。只需在需要前一天为下个月构建分区即可。同时保留一个 future
分区,以防处理无法及时构建分区。
更多讨论在这里:http://mysql.rjweb.org/doc.php/partitionmaint
请注意,每月分区的唯一用途是如果您打算通过快速 DROP PARTITION
代替慢速 DELETE
来清除“旧”数据。