素数を求めるストアドプロシージャ

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)