Я согласен с extraneon, что обычно лучше хранить это значение в базе данных, а не вычислять его в предложении where. Таким образом, вы можете вычислить его один раз для каждой строки и проиндексировать данные для повышения производительности.
Пока вы используете MySQL 5.x, я бы рекомендовал хранимую функцию, а не UDF. Вы можете добавить столбец IS_PRIME
типа TINYINT
в свою БД, добавить индекс для этого столбца, а затем использовать сохраненную функцию для вычисления значения во время вставки. Вы даже можете вычислить значение IS_PRIME
, используя триггер перед вставкой, если не хотите изменять код вставки.
Сохраненная функция будет выглядеть примерно так:
DELIMITER $$
DROP FUNCTION IF EXISTS IS_PRIME $$
CREATE FUNCTION IS_PRIME(P_INT BIGINT) RETURNS TINYINT
BEGIN
DECLARE V_FACTOR BIGINT;
DECLARE V_MAX_FACTOR BIGINT;
SET V_FACTOR := 2;
SET V_MAX_FACTOR := round(sqrt(P_INT),0);
WHILE (V_FACTOR <= V_MAX_FACTOR)
DO
IF (P_INT % V_FACTOR) = 0
THEN
RETURN FALSE;
END IF;
SET V_FACTOR := V_FACTOR + 1;
END WHILE;
RETURN TRUE;
END $$
DELIMITER ;