MySQL 按时间进行表分区

创建按月份分区的表

create table if not exists table_name
(
    id          bigint auto_increment comment '主键id',
    
    create_by   varchar(64)                        not null comment '创建者',
    create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
    update_by   varchar(64)                        null comment '更新者',
    update_time datetime default CURRENT_TIMESTAMP null on update CURRENT_TIMESTAMP comment '更新时间',
    primary key (id, create_time)
)
    comment '测试表名' partition by range (TO_DAYS(create_time)) (
    partition P202401 values less than (TO_DAYS('2024-02-01')) ,
    partition P202402 values less than (TO_DAYS('2024-03-01')) ,
    partition P202403 values less than (TO_DAYS('2024-04-01')) ,
    partition P202404 values less than (TO_DAYS('2024-05-01'))
);

开启数据库事件

临时配置(服务重启会失效)

-- 开启事件
SET GLOBAL event_scheduler = ON;
-- 查看事件是否开启
SHOW VARIABLES LIKE '%event_sche%';

修改my.cnf文件(推荐)

  • 进入MySQL所在的服务器
sudo vi /etc/my.cnf
  • 找到 [mysqld],添加如下内容
event_scheduler = ON
  • 重启 MySQL 服务以使更改生效
sudo systemctl restart mysqld

定时事件自动建分区

  • 例:提前创建下个月的分区,如2024-04-01创建5月份的分区 P202405,2024-05-01创建6月份的分区。
create event event_create_partition on schedule
    every '1' MONTH starts '2024-04-01 00:00:00'
    on completion preserve
    enable 
    do 
    BEGIN
    
    	-- 当前时间 2024-04-01 00:00:00
		-- _DATE = 2024-05-01
    	DECLARE _DATE VARCHAR(10) DEFAULT ADDDATE(SUBDATE(CURDATE(), DAY(CURDATE()) - 1), INTERVAL 1 MONTH);
    	-- P202405
    	SET @PARTITION_NAME = CONCAT('P', DATE_FORMAT(_DATE, '%Y%m'));
    	-- 2024-06-01
    	SET @SHEAR_DATE = CONCAT('', ADDDATE(LAST_DAY(_DATE), 1));
    	
        SET @SQL = CONCAT('ALTER TABLE table_name ADD PARTITION (PARTITION ', @PARTITION_NAME, ' VALUES LESS THAN (TO_DAYS("', @SHEAR_DATE, '")))');
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;

    END;

注意: 数据库event_scheduler = ON 要确认有开启,否则 event_create_partition 事件不会执行。

  • 查看所有事件
SHOW EVENTS;

查询表分区信息

SELECT
   TABLE_SCHEMA,
   TABLE_NAME,
   PARTITION_NAME,
   PARTITION_METHOD,
   PARTITION_EXPRESSION,
   SUBPARTITION_NAME,
   SUBPARTITION_METHOD,
   SUBPARTITION_EXPRESSION
FROM information_schema.partitions
WHERE TABLE_SCHEMA = '数据库名'
AND TABLE_NAME IN ('table_name')
ORDER BY PARTITION_NAME DESC;
  • 17
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您解答这个问题。 MySQL分区表可以提高查询性能,并且可以通过按时间范围进行自动分区,以便更好地管理和维护数据。下面是按天执行分区表SQL的步骤: 1. 创建分区表 您可以使用以下命令创建一个按天分区: ``` CREATE TABLE mytable ( id INT NOT NULL, created_at TIMESTAMP NOT NULL ) PARTITION BY RANGE(TO_DAYS(created_at)) ( PARTITION p0 VALUES LESS THAN (TO_DAYS('2022-01-01')), PARTITION p1 VALUES LESS THAN (TO_DAYS('2022-01-02')), PARTITION p2 VALUES LESS THAN (TO_DAYS('2022-01-03')), ... PARTITION pn VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“mytable”的分区表,其中“created_at”列将用于分区分区将按天进行。您需要为每个分区指定值范围,例如“p0”分区包含所有在“2022-01-01”之前创建的记录。 2. 创建分区维护事件 您可以创建一个事件,定期检查并创建新的分区。以下是一个示例事件: ``` CREATE EVENT partition_maintenance ON SCHEDULE EVERY 1 DAY DO ALTER TABLE mytable ADD PARTITION ( PARTITION pmax VALUES LESS THAN MAXVALUE ); ``` 这将创建一个名为“partition_maintenance”的事件,每天运行一次,它将在“mytable”中创建一个新的分区。 3. 自动分区 您可以在中插入数据时自动创建分区。以下是一个示例触发器: ``` CREATE TRIGGER partition_insert BEFORE INSERT ON mytable FOR EACH ROW BEGIN DECLARE partition_name VARCHAR(20); SET partition_name = CONCAT('p', DATE_FORMAT(NEW.created_at, '%Y%m%d')); SET @partition_sql = CONCAT('PARTITION ', partition_name, ' VALUES LESS THAN (TO_DAYS(\'', DATE_ADD(DATE(NEW.created_at), INTERVAL 1 DAY), '\'))'); SET @sql = CONCAT('ALTER TABLE mytable ADD ', @partition_sql); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; ``` 这将创建一个名为“partition_insert”的触发器,在插入新记录时自动创建新的分区。该触发器将使用新记录的“created_at”值计算分区名称,并为该名称创建一个新的分区。 总之,以上是按天执行分区表SQL的步骤,希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逢生博客

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值