首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql过程分区表

问Mysql过程分区表
EN

Stack Overflow用户
提问于 2021-08-19 06:59:21
回答 1查看 38关注 0票数 0

我不知道为什么我的脚本不能工作!我开发了对表进行分区的过程。我已经使用scheduler运行了该过程,但没有创建分区。

我想每个月做一个分区表,作为程序中的变量months_future。因此我用了“while”。

有人能帮我吗??

这是有程序的。

代码语言:javascript
复制
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 ;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-19 23:35:46

不要在将来构建多个分区;这会减慢速度。只需在需要分区的前一天为下个月构建分区。另外,保留一个future分区,以防处理无法及时构建该分区。

更多讨论请点击这里:http://mysql.rjweb.org/doc.php/partitionmaint

请注意,只有当您打算通过fast DROP PARTITION而不是慢速DELETE清除“旧”数据时,才能使用每月分区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68843322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档