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; 
相关推荐
Nturmoils17 小时前
订单列表慢查询,先看 WHERE、ORDER BY 和 LIMIT
数据库
渣波21 小时前
拒绝 SQL 焦虑!手把手带你用 NestJS + Prisma + DTO 写出“防弹”级后端代码
javascript·数据库·后端
Jim6002 天前
【吃透 MySQL InnoDB连载】第 1 章・解密线上数据库高频故障
mysql
GreatSQL2 天前
gt-checksum v4.0.0 新功能解读系列文章(4):SSL 加密连接——数据校验传输安全再升级
mysql
倔强的石头_2 天前
KingbaseES 新版MySQL 兼容版体验:旧版迁移 + 功能实测
数据库
倔强的石头_5 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横5 天前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二5 天前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab5 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm