Jeg endte med proceduren nedenfor. Det virker, men jeg er ikke sikker på, om det er effektivt med alle forespørgsler til at identificere på hinanden følgende områder. Det kan kaldes med følgende argumenter (eksempel):
call chunkUpdate('SET var=0','someTable','theKey',500000);
Grundlæggende er det første argument opdateringskommandoen (f.eks. noget som "sæt x =..."), efterfulgt af mysql-tabelnavnet, efterfulgt af en numerisk (heltal) nøgle, der skal være unik, efterfulgt af størrelsen af bidder, der skal behandles. Nøglen skal have et indeks for rimelig ydeevne. Variablen "n" og "select"-sætningerne i koden nedenfor kan fjernes og er kun til fejlretning.
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//