我在处理更新和在 MySQL 数据库中插入数百万行时遇到了一些问题。我需要在表 A 中标记 5000 万行,将标记的 5000 万行中的一些数据插入表 B,然后再次更新表 A 中相同的 5000 万行。表 A 中有大约 1.3 亿行,表 B 中有 8000 万行。
这需要在实时服务器上进行,而不会拒绝访问来自网站的其他查询。问题是当这个存储过程运行时,来自网站的其他查询最终被锁定并且 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 ;