如何修改MySQL存储过程以生成带当前日期的随机HH:MM:SS时间戳
存储过程修改方案
核心修改逻辑:将原代码中写死的固定日期替换为CURDATE()即可动态获取调用当天的日期,UNIX_TIMESTAMP(CURDATE())会自动返回当天0点的Unix时间戳,叠加0~86399的随机秒数后就能生成当天任意时刻的随机时间戳。
最小修改版(仅调整日期逻辑)
DELIMITER $$ CREATE PROCEDURE producer() BEGIN DECLARE a INT DEFAULT 0; WHILE a < 10000000 DO INSERT INTO CaseLog (`TIMESTAMP_IN`) VALUES (FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE())+FLOOR(RAND()*86399))); SET a = a+1; END WHILE; END$$ DELIMITER ;
性能优化版(适配1000万条大数据量插入)
单条循环插入1000万条性能极低,优化后版本如下:
DELIMITER $$ CREATE PROCEDURE producer() BEGIN DECLARE a INT DEFAULT 0; -- 关闭自动提交,减少磁盘IO次数 SET autocommit = 0; -- 每次批量插入1000条,循环1万次即可完成1000万条插入 WHILE a < 10000 DO INSERT INTO CaseLog (`TIMESTAMP_IN`) VALUES (FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE())+FLOOR(RAND()*86399))), (FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE())+FLOOR(RAND()*86399))), -- 此处省略剩下998行VALUES项,实际使用时补全到1000条即可 (FROM_UNIXTIME(UNIX_TIMESTAMP(CURDATE())+FLOOR(RAND()*86399))); SET a = a+1; END WHILE; -- 统一提交事务 COMMIT; SET autocommit = 1; END$$ DELIMITER ;
额外优化建议
- 插入前临时删除
CaseLog表上的非必要索引、触发器,插入完成后再重建,插入速度可提升数倍 - 如果使用InnoDB引擎,可临时修改
innodb_flush_log_at_trx_commit参数为0,插入完成后改回原值,进一步降低IO开销
内容的提问来源于stack exchange,提问作者TripehCoder
相关产品推荐
相关产品推荐

