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時間...それを最適化する方法はありますか?