mysql数据库使用unix_timestamp函数按天进行分区方案

1.创建分区表

sql 复制代码
/*在MySQL中,UNIX_TIMESTAMP函数是一个非常常用的函数,它用于将日期时间转换为时间戳。
时间戳是表示日期和时间的一种整数形式,它表示自1970年1月1日以来的秒数。
使用UNIX_TIMESTAMP函数可以方便地将日期转换为时间戳,在处理日期时间相关的数据时非常方便。
模拟创建一个表game,分区字段为send_time,由于send_time存储的为时间戳,所以本次分区采用unix_timestamp函数来将日期转换为时间戳,来与send_time做比较。*/
CREATE TABLE `game` (
   `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
   `send_time` int unsigned NOT NULL COMMENT '发送时间戳(发送时间和1970年1月1号0时0分0秒所差的秒数)',
   PRIMARY KEY (`id`,`send_time`)                                       -- send_time分区字段必须为与原自增id配置为复合主键
) ENGINE=INNODB DEFAULT CHARSET=utf8
PARTITION BY RANGE (send_time)                                          -- 创建一个以send_time为范围分区的表
(PARTITION p20240704 VALUES LESS THAN (unix_timestamp('2024-07-05')),   -- 分区名字命名为p日期,数据存放条件为小于后一天的timestamp时间
 PARTITION p20240705 VALUES LESS THAN (unix_timestamp('2024-07-06'))
);

-- 如需删除测试表
drop table game;

2.调用存储过程

sql 复制代码
/* 在t数据库下,创建存储过程,名字为time_partition_procedure
存储过程说明,通过查询information_schema.PARTITIONS获取当前分区最后一个时间点,然后赋值给in_date变量,将in_date向后推1天作为@date,向后推2天作为@max_date
通过命令ALTER TABLE 表名 add PARTITION自动创建分区,分区名称为p@date,范围小于@max_date */
DELIMITER $$
USE `t`$$
DROP PROCEDURE IF EXISTS `time_partition_procedure`$$
CREATE DEFINER=`root`@`%` PROCEDURE `time_partition_procedure`()
BEGIN
SELECT REPLACE(b.partition_name,'p','') INTO @in_date FROM information_schema.PARTITIONS b WHERE b.table_name ='game' ORDER BY b.partition_ordinal_position DESC LIMIT 1;  
SET @max_date= DATE_ADD(@in_date,INTERVAL 1 DAY)+1 ;
SET @date= DATE_ADD(@in_date,INTERVAL 1 DAY)+0 ;
SET @sql=CONCAT('ALTER TABLE game add PARTITION (PARTITION p',@date,' VALUES LESS THAN (unix_timestamp(''',@max_date,''')));');
SELECT @sql;
SELECT @max_date;
PREPARE strsql FROM @sql;    #预执行sql
EXECUTE strsql;           #执行sql 
DEALLOCATE PREPARE strsql;   #释放sql
COMMIT;
END$$

--如需删除存储过程
DROP PROCEDURE t.time_partition_procedure;

--查看存储过程的建表语句
SHOW CREATE PROCEDURE t.time_partition_procedure;

3.创建event事件

sql 复制代码
--创建event事件,通过event定时调度任务来调用以上存储过程time_partition_procedure创建分区,注意使用该方案,需要启用event事件才行。
DELIMITER $$
CREATE EVENT `t`.`time_partition_event`
ON SCHEDULE EVERY 1 DAY STARTS DATE_ADD(CURRENT_DATE+1,INTERVAL 3 HOUR)
ON COMPLETION PRESERVE
ENABLE DO
BEGIN
    CALL time_partition_procedure();
END$$


--如需删除事件
drop event `t`.`time_partition_event`;


--查看t数据库下的event
show events from t;


--采用如下2个命令确认事件event是否启用。
SHOW VARIABLES LIKE 'event_scheduler';
SELECT @@event_scheduler;

--查看event的执行情况,最后一次执行的时间
select EVENT_NAME,LAST_EXECUTED,STATUS from information_schema.events;

4.存储过程手工调用和验证

sql 复制代码
-- 手工调用存储过程
CALL t.time_partition_procedure();

--调用完成之后,查看是否生成了新的分区
show create table game;
或者
select TABLE_NAME,PARTITION_NAME,PARTITION_ORDINAL_POSITION FROM information_schema.PARTITIONS b WHERE b.table_name ='game' ORDER BY b.partition_ordinal_position DESC LIMIT 10\G; 
相关推荐
lifewange16 分钟前
Java 自动化测试参数化实现
java·数据库·sqlserver
m0_7447249325 分钟前
Oracle单行函数学习
数据库·oracle
rainy雨32 分钟前
质量工具系统功能详解:针对检验效率低与追溯困难场景的质量工具应用方案
java·大数据·数据库·人工智能·精益工程
geyasi33 分钟前
【Flask】四、flask连接并操作数据库
数据库·python·flask
金仓数据库35 分钟前
浙人医的国产软硬一体诊疗 | 电科金仓携手迈瑞打通PACS链路
大数据·数据库·人工智能
荒川之神1 小时前
Oracle 开窗函数 专项练习文档
数据库·oracle
Java面试题总结1 小时前
WAF 误杀了正常请求怎么补数据?CloudFront + Lambda@Edge 双函数架构实战
数据库·架构·edge
weixin_704266051 小时前
Redis集群架构与搭建全攻略
数据库·redis·架构
二进制_博客1 小时前
使用Datax批量将mysql数据导入hive
数据库·hive·mysql
Hvitur1 小时前
软考架构师【第八章】系统质量属性与架构评估
数据库·架构