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; 
相关推荐
shyの同学1 小时前
分布式ID生成方案:数据库号段、Redis与第三方开源实现
redis·分布式·mysql·id
月落星还在1 小时前
Redis 的过期策略与键的过期时间设置
数据库·redis·bootstrap
cg50174 小时前
MySQL数据库复杂的增删改查操作
数据库·mysql
虾球xz5 小时前
游戏引擎学习第147天
数据库·学习·游戏引擎
向上的车轮6 小时前
什么是时序数据库?有哪些时序数据库?常见的运用场景有哪些?
数据库·时序数据库
岱宗夫up7 小时前
【Python】Django 中的算法应用与实现
数据库·python·opencv·django·sqlite
比花花解语7 小时前
使用数据库和缓存的时候,是如何解决数据不一致的问题的?
数据库·缓存·数据一致性
YGGP8 小时前
Redis篇:基础知识总结与基于长期主义的内容更新
数据库·redis·缓存
KINICH ahau8 小时前
数据库1-2章
数据库·oracle
我想吃烤肉肉8 小时前
leetcode-sql数据库面试题冲刺(高频SQL五十题)
数据库·sql·leetcode