У меня есть представление в моей базе данных (MySQL), которое ранжирует пользователей. Он генерируется с помощью функций:
CREATE ALGORITHM=UNDEFINED SQL SECURITY INVOKER VIEW `users_ranks` AS select distinct `u`.`id` AS `id`,
`isUserVerified`(`u`.`id`) AS `verification`,
`hasUserPicture`(`u`.`id`) AS `profile_picture`,
`hasUserHobbies`(`u`.`id`) AS `hobbies`,
...
) AS total_value
from `users` `u`
Это пример одной из функций, вызываемых представлением:
CREATE FUNCTION hasUserPicture(user_id INT(10) UNSIGNED) RETURNS int(3)
NO SQL
DETERMINISTIC
SQL SECURITY INVOKER
BEGIN
DECLARE hasPicture VARCHAR(191);
SELECT
users.profile_picture
INTO
hasPicture
FROM
users
WHERE
users.id = user_id
LIMIT 1;
IF hasPicture IS NULL or hasPicture = '' THEN
RETURN 0;
ELSE
RETURN 4;
END IF;
END;
На мой взгляд, существует множество вызовов функций (обновлениезанимает 21сек)Проблема заключается в том, что представление обновляется всякий раз, когда пользователь изменяет информацию, а большое количество пользователей приводит к тому, что целому приложению не хватает памяти и происходит сбой. Как я могу решить проблему? Есть ли лучший способ добиться того же результата?