素数を求めるストアドプロシージャ
10000までの数の素数を求める場合、以下のプロシージャで1.8秒。使っているマシンはThinkPad X31(PentiumM 1.7GHz)
DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`proc_sosuu2` $$ CREATE PROCEDURE `proc_sosuu2`(IN num INT) BEGIN DECLARE i INT; DECLARE max_i INT; DROP TABLE IF EXISTS sosuu; CREATE TABLE sosuu (c1 INT PRIMARY KEY) ENGINE = MEMORY; SET i = 2; WHILE i <= num DO INSERT INTO sosuu VALUES (i); SET i= i + 1; END WHILE; SET max_i = num; SET i = 2; WHILE i != max_i DO DELETE FROM sosuu WHERE MOD(c1, i) = 0 AND c1 != i; SELECT MAX(c1), MIN(c1) FROM sosuu WHERE c1 > i INTO max_i, i; END WHILE; SELECT COUNT(*) FROM sosuu; END $$ DELIMITER ;
今週はずっとMySQL 5.0のセミナーを受けているのですが、演習でこんな出題がなされ、最初に作ったSP(10000を処理するのに約20秒)を改造してたら1/10くらいまで速くなりました。
これ以上速くできる余地はあまり無さそうなのですが、もしあったら突っ込んでください。
root@localhost [test]>call proc_sosuu2(10000); +----------+ | COUNT(*) | +----------+ | 1229 | +----------+ 1 row in set (1.78 sec) Query OK, 0 rows affected (1.79 sec)