gpt4 book ai didi

mysql - 生成 16M 唯一随机数

转载 作者:行者123 更新时间:2023-11-29 04:51:47 25 4
gpt4 key购买 nike

我正在尝试生成 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 小时...有什么办法可以优化吗?

最佳答案

您要的是矛盾修辞法。如果 16M 数字是唯一的,那么它们就不是随机的。想一想:一个真正的 10 位随机数有 1/9E9 是任何给定数字的概率。然而,您的第 16M 个数字有 0 个概率是 15,999,999 个数字之一,有 1/983,000,001 个概率是其余数字之一。你应该总是期待重复。 1B 中的 16M 大约有 1%。

所以我的建议是生成(16M+一点)随机数,做唯一排序;截断到 16M 然后随机排序。我的问答:

php -r 'for( $i=0;$i<16500000;$i++) echo mt_rand(100000000, 999999999),"\n";'\
| sort -u | head -16000000 | sort -R > /tmp/loadfile.lst

在我用了 4 年的笔记本电脑上只用了 7 多分钟。在现代四核台式机上,它的速度将很多。我使用 PHP-CLI,因为我的笔记本电脑上有它,而且 mt_rand 例程很好。您可以将其作为 3 liner-C prog 或手边的任何语言来执行此操作。正如 Zercms 所说,只要在加载前禁用索引并在加载后重新启用索引,加载就会很快。您也只需要加载列 code

享受吧。

关于mysql - 生成 16M 唯一随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11014135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com