You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:15:03