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; 
相关推荐
AIGC大时代26 分钟前
对比DeepSeek、ChatGPT和Kimi的学术写作撰写引言能力
数据库·论文阅读·人工智能·chatgpt·数据分析·prompt
如风暖阳33 分钟前
Redis背景介绍
数据库·redis·缓存
lingllllove2 小时前
Redis脑裂问题详解及解决方案
数据库·redis·缓存
字节全栈_BjO2 小时前
mysql死锁排查_mysql 死锁问题排查
android·数据库·mysql
微光守望者2 小时前
Redis常见命令
数据库·redis·缓存
martian6653 小时前
第六篇:事务与并发控制
数据库
x-cmd5 小时前
[250202] DocumentDB 开源发布:基于 PostgreSQL 的文档数据库新选择 | Jekyll 4.4.0 发布
数据库·postgresql·开源
是小崔啊10 小时前
事务03之MVCC机制
数据库·mysql·事务·
LUCIAZZZ14 小时前
简单的SQL语句的快速复习
java·数据库·sql
Elastic 中国社区官方博客15 小时前
使用真实 Elasticsearch 进行高级集成测试
大数据·数据库·elasticsearch·搜索引擎·全文检索·jenkins·集成测试