Tôi đã kết thúc với quy trình được liệt kê dưới đây. Nó hoạt động nhưng tôi không chắc liệu nó có hiệu quả với tất cả các truy vấn để xác định các phạm vi liên tiếp hay không. Nó có thể được gọi với các đối số sau (ví dụ):
call chunkUpdate('SET var=0','someTable','theKey',500000);
Về cơ bản, đối số đầu tiên là lệnh cập nhật (ví dụ như "set x =..."), theo sau là tên bảng mysql, tiếp theo là khóa số (số nguyên) phải là duy nhất, tiếp theo là kích thước của khối được xử lý. Chìa khóa nên có một chỉ mục cho hiệu suất hợp lý. Biến "n" và câu lệnh "select" trong mã bên dưới có thể bị xóa và chỉ để gỡ lỗi.
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//