Есть MariaDB 10.3 и примерно такая процедура MySQL:
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE v_id, v_user_id, v_created INT;
DECLARE cur1 CURSOR FOR SELECT `id`, `user_id`, `created` FROM `table` WHERE `update` = 0 ORDER BY `id` DESC;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
UPDATE `table` SET `update` = 0 WHERE 1;
OPEN cur1;
WHILE done = 0 DO
FETCH cur1 INTO v_id, user_id, v_created;
IF done = 0 THEN
// Несколько различных SQL заросов (INSERT IGNORE, INSER UPDATE, UPDATE, SELECT)
UPDATE `table` SET `update` = 1 WHERE `id` = v_id LIMIT 1;
END IF;
END WHILE;
CLOSE cur1;
END
В таблице более 1 млн строк, процедура выполняется несколько суток. Как можно оптимизировать ее? Возможно, нужно добавить блокировки и запустить процедуру несколько раз параллельно? Но как правильно установить блокировки, чтобы строка в таблице не была пройдена несколько раз и это не сказалось на выборке для курсора процедуры, которая работает параллельно?
UPD:
https://jira.mariadb.org/browse/MDEV-13115