@entermix

Как оптимизировать процедуру MySQL?

Есть 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
  • Вопрос задан
  • 169 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы