【发布时间】:2021-06-25 22:07:47
【问题描述】:
MySql - innodb_version 5.7.33
我正在研究一个存储过程,该过程将被定期调用(假设每月一次)以填充一个表,其中一列中的字符串列表和另一列中的静态值。 该表还有
- ID 列 (AUTO_INCREMENT) 和
- 时间戳列(CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP)
字符串是固定字符加上整数(比如说 10)的串联。 这个整数在范围内必须是非重复随机的。
CREATE DEFINER=`db`@`%` PROCEDURE `InsertRandom`(IN NumRows INT, IN MinVal INT, IN MaxVal INT)
BEGIN
DECLARE i INT;
DECLARE UniqueId INT(15);
SET i = 1;
START TRANSACTION;
WHILE i <= NumRows DO
SET UniqueId = concat('ABC', MinVal + CEIL(RAND() * (MaxVal - MinVal)));
IF NOT EXISTS (SELECT UNIQUE_ID FROM MY_TABLE WHERE UNIQUE_ID = UniqueId) THEN
INSERT INTO MY_TABLE (`UNIQUE_ID`, `STATE`, `RANGE_ID`) VALUES (UniqueId, 'new', '100');
END IF;
SET i = i + 1;
END WHILE;
COMMIT;
END
每个过程调用的范围(minVal 和 maxVal)将为 100 万。
例如,
CALL InsertRandom(1000000, 10000000,11000000);
该表将在 5 个月内清除一次,保留 1 个月的数据,因此我们可以假设在执行此过程时大约有 500 万条记录,并且 select inside loop 的使用不是最佳的,所以请建议一种替代方法。
(来自评论:)
目标是在给定范围内创建一个具有唯一 ID 的表。这些不应该是按顺序排列的。范围在时间最小为一百万,最大为 10 毫米。其中的块将被加载到服务器的内存中以进行进一步处理。我对有效填充此表的选项感兴趣。
【问题讨论】:
-
转储选择并使用插入忽略?
-
太好了,谢谢@Shadow。这真的很有帮助。相应地更新了程序。只是它与定义为自动增量的 ID 列混淆。有差距。
-
那么如果自增列有间隙怎么办?这很正常!
-
备份。请说明目标,而不是问“如何解决这个设计”。
-
目标是在给定范围内创建一个具有唯一 ID 的表。这些不应该是按顺序排列的。范围在时间最小为一百万,最大为 10 毫米。其中的块将被加载到服务器内存中以进行进一步处理。我对有效填充此表的选项感兴趣。如原始问题所述,该表将定期清除。提前感谢您的帮助。
标签: mysql stored-procedures random