元の 3,000 行を複数回複製することによって生成された、約 1 億行のテスト データベース テーブルがあります。このテーブルが、タイムスタンプを持ついくつかのイベントを記述しているとしましょう。現在、クローン作成により、1 日あたり約 1,000 万件のイベントが発生していますが、これは実際のケースとはかけ離れています。そこで、日付列をランダム化し、レコードを数日間分散させたいと思います。これが私が思いついた手順です:
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 時間かかります。それをスピードアップする方法はありますか?それとも、私の手順がまったく間違っているのでしょうか?