mysql通过计划任务创建月表
一、背景
系统中存在一个大数据量的表,为了性能,打算一个月创建一个月表来分表
二、步骤
- 首选,开启mysql的事务调度器
SET GLOBAL event_scheduler = ON; - 编写创建表的存储过程
CREATE DEFINER=`root`@`%` PROCEDURE `create_table`()
BEGIN
DECLARE year INT;
DECLARE month INT;
DECLARE table_name VARCHAR(255);
DECLARE index_name VARCHAR(255);
SET year = YEAR(CURDATE());
SET month = MONTH(CURDATE());
SET table_name = CONCAT('test_', year, '_', LPAD(month,2,'0'));
SET index_name = CONCAT('plm_event_time_',year, '_', LPAD(month,2,'0'));
SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS ', table_name, ' (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT \'测试\',
`etime` datetime NULL DEFAULT NULL COMMENT \'测试\',
`etype` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT \'测试\',
`ecomment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT \'测试\',
`tagcode` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试\',
`tagtype` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试,1:测试 2:测试 3:测试\',
`pno` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试\',
`pcode` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试、测试、测试\',
`pname` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试、测试、测试\',
`zcode` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试\',
`zname` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试\',
`isdelete` varchar(2) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT \'测试\',
`createtime` datetime NULL DEFAULT NULL COMMENT \'测试\',
`updatetime` datetime NULL DEFAULT NULL COMMENT \'测试\',
`deletetime` datetime NULL DEFAULT NULL COMMENT \'测试\',
PRIMARY KEY (`id`) USING BTREE,
INDEX ',index_name,'(`etime`) USING BTREE',
') ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = \'测试\' ROW_FORMAT = Dynamic;');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END
- 创建计划任务,从某个时间点一个月创建一次
CREATE DEFINER = `root`@`%` EVENT `test`.`task`
ON SCHEDULE
EVERY '1' MONTH STARTS '2023-01-01 00:00:00'
DO BEGIN
CALL create_table();
END;
三、后记
这种方式适合小型项目,如果是真的数据量庞大建议用mycat分库分表。

浙公网安备 33010602011771号