先在測試環境測試,沒問題再上生產環境,避免生產環境數據庫負載過多而崩潰
創建存儲過程
DELIMITER //CREATE PROCEDURE batch_add_index_to_email()
BEGINDECLARE done INT DEFAULT FALSE;DECLARE start_id INT DEFAULT 0;DECLARE end_id INT;DECLARE batch_size INT DEFAULT 10000;-- 獲取最大的IDSELECT MAX(id) INTO end_id FROM test_table;WHILE start_id < end_id DO-- 在每批次的數據上添加索引SET @sql = CONCAT('ALTER TABLE your_table ADD INDEX idx_email (email);');-- 執行動態 SQLPREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;-- 更新批次的起始IDSET start_id = start_id + batch_size;END WHILE;
END //DELIMITER ;
執行存儲過程
CALL batch_add_index_to_email()