MySQL 执行 UPDATE 语句时,主要经历以下步骤:
-- 使用LIMIT分批更新
UPDATE large_table SET column1 = value
WHERE condition LIMIT 10000;
-- 或者使用循环程序控制
DELIMITER //
CREATE PROCEDURE batch_update()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE batch_size INT DEFAULT 10000;
DECLARE offset INT DEFAULT 0;
WHILE NOT done DO
UPDATE large_table SET column1 = value
WHERE condition LIMIT batch_size OFFSET offset;
IF ROW_COUNT() = 0 THEN
SET done = TRUE;
END IF;
SET offset = offset + batch_size;
-- 添加短暂延迟减少锁争用
DO SLEEP(0.1);
END WHILE;
END //
DELIMITER ;
-- 小事务提交
START TRANSACTION;
UPDATE table SET column = value WHERE id BETWEEN 1 AND 1000;
COMMIT;
START TRANSACTION;
UPDATE table SET column = value WHERE id BETWEEN 1001 AND 2000;
COMMIT;
innodb_lock_wait_timeout
对于极大规模更新:
CREATE TABLE new_table LIKE original_table;
INSERT INTO new_table SELECT * FROM original_table WHERE ...;
-- 应用更新逻辑
RENAME TABLE original_table TO old_table, new_table TO original_table;
DROP TABLE old_table;
-- 查看当前锁情况
SHOW ENGINE INNODB STATUS;
-- 监控长事务
SELECT * FROM information_schema.INNODB_TRX;
-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;
通过合理应用这些策略,可以显著提高MySQL大规模UPDATE操作的效率,同时降低死锁风险。