我有一个大约 100m 行的测试数据库表,它是通过多次克隆原始 3k 行生成的。假设这张表描述了一些具有时间戳的事件。由于克隆,现在我们每天有大约 1000 万个事件,这与真实案例相去甚远。所以我想随机化日期列并将记录分散几天。这是我想出的程序:
DROP PROCEDURE IF EXISTS `randomizedates`;
DELIMITER //
CREATE PROCEDURE `randomizedates`(IN `daterange` INT)
BEGIN
DECLARE id INT UNSIGNED;
DECLARE buf TIMESTAMP;
DECLARE done INT DEFAULT FALSE;
DECLARE cur1 CURSOR FOR SELECT event_id FROM events;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur1;
the_loop: LOOP
FETCH cur1 INTO id;
IF done THEN
LEAVE the_loop;
END IF;
SET buf = (SELECT NOW() - INTERVAL FLOOR(RAND() * daterange) DAY);
UPDATE events SET starttime = buf WHERE event_id = id;
END LOOP the_loop;
CLOSE cur1;
END //
DELIMITER ;
在 3k 表上,它执行约 6 秒,因此假设线性复杂性,在 100m 表上应用需要约 50 小时。有没有办法加快速度?或者也许我的程序根本不正确?