MySQL データベースで何百万もの行を更新および挿入する際に問題が発生しています。テーブル A の 5,000 万行にフラグを付け、マークされた 5,000 万行のデータをテーブル B に挿入し、テーブル A の同じ 5,000 万行を再度更新する必要があります。テーブル A には約 1 億 3000 万行、テーブル B には 8000 万行あります。
これは、Web サイトからの他のクエリへのアクセスを拒否することなく、ライブ サーバーで行う必要があります。問題は、このストアド プロシージャの実行中に、Web サイトからの他のクエリがロックされ、HTTP 要求がタイムアウトになることです。
これがSPの要点であり、説明のために少し簡略化されています。
CREATE DEFINER=`user`@`localhost` PROCEDURE `MyProcedure`(
totalLimit int
)
BEGIN
SET @totalLimit = totalLimit;
/* Prepare new rows to be issued */
PREPARE STMT FROM 'UPDATE tableA SET `status` = "Being-Issued" WHERE `status` = "Available" LIMIT ?';
EXECUTE STMT USING @totalLimit;
/* Insert new rows for usage into tableB */
INSERT INTO tableB (/* my fields */)
SELECT /* some values from TableA */
FROM tableA
WHERE `status` = "Being-Issued";
/* Set rows as being issued */
UPDATE tableB SET `status` = 'Issued' WHERE `status` = 'Being-Issued';
END$$
DELIMITER ;