我正在尝试生成 16 000 000 个唯一的随机数(10 位:范围 1 000 000 000 - 9 999 999 999)并将它们插入到一个空表中(或者如果不为空,则填写此表)。
桌子:
CREATE TABLE `codes` (
`code_id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`code` bigint(20) UNSIGNED NOT NULL,
`is_used` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`code_id`),
UNIQUE KEY `code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
...和功能:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `codes`(`minRange` BIGINT UNSIGNED, `maxRange` BIGINT UNSIGNED, `_amount` BIGINT UNSIGNED) RETURNS tinyint(1)
MODIFIES SQL DATA
BEGIN
DECLARE pick BIGINT;
while (SELECT count(*) FROM codes) < _amount do
begin
SET pick = minRange + FLOOR(RAND() * (maxRange - minRange + 1));
INSERT IGNORE INTO codes (code) VALUES (pick);
end;
end while;
RETURN 1;
END$$
DELIMITER ;
-- call: SELECT codes(1000000000,9999999999,16000000);
该功能非常慢:生成 20k 行需要 2.5 分钟,所以 16M - 大约 33 小时......有没有办法优化它?