Завърших с процедурата, описана по-долу. Работи, но не съм сигурен дали е ефективно с всички заявки за идентифициране на последователни диапазони. Може да се извика със следните аргументи (пример):
call chunkUpdate('SET var=0','someTable','theKey',500000);
По принцип първият аргумент е командата за актуализиране (напр. нещо като "set x =..."), последвано от името на таблицата mysql, последвано от цифров (цяло число) ключ, който трябва да бъде уникален, последван от размера на парчета за обработка. Ключът трябва да има индекс за разумна производителност. Променливата "n" и операторите "select" в кода по-долу могат да бъдат премахнати и са само за отстраняване на грешки.
delimiter //
CREATE PROCEDURE chunkUpdate (IN cmd VARCHAR(255), IN tab VARCHAR(255), IN ky VARCHAR(255),IN sz INT)
BEGIN
SET @sqlgetmin = CONCAT("SELECT MIN(",ky,")-1 INTO @minkey FROM ",tab);
SET @sqlgetmax = CONCAT("SELECT MAX(",ky,") INTO @maxkey FROM ( SELECT ",ky," FROM ",tab," WHERE ",ky,">@minkey ORDER BY ",ky," LIMIT ",sz,") AS TMP");
SET @sqlstatement = CONCAT("UPDATE ",tab," ",cmd," WHERE ",ky,">@minkey AND ",ky,"<[email protected]");
SET @n=1;
PREPARE getmin from @sqlgetmin;
PREPARE getmax from @sqlgetmax;
PREPARE statement from @sqlstatement;
EXECUTE getmin;
REPEAT
EXECUTE getmax;
SELECT cmd,@n AS step, @minkey AS min, @maxkey AS max;
EXECUTE statement;
set @[email protected];
set @[email protected]+1;
UNTIL @maxkey IS NULL
END REPEAT;
select CONCAT(cmd, " EXECUTED IN ",@n," STEPS") AS MESSAGE;
END//