使用存储过程实现千万级的大批量数据插入
t_user表
创建存储过程 insert_user(IN c int(10));
CREATE PROCEDURE insert_user(IN c int(10))
BEGIN
DECLARE i INT DEFAULT 0 ;
REPEAT
SET i = i + 1 ;
INSERT INTO t_user (`name`, `addr`)VALUES("aaaaaaa", "bbbbbbb") ;
UNTIL i = c END REPEAT;
END
调用存储过程 Call pro_name(args);
-- MySQL默认为自动提交 SHOW VARIABLES LIKE %autocommit%; -- 设置当前会话不自动提交 SET SESSION autocommit=0; SHOW VARIABLES LIKE %autocommit%; -- 新插入八千万行数据 CALL insert_user(80000000); -- 提交 COMMIT; -- 设置当前会话自动提交 SET SESSION autocommit=1; SHOW VARIABLES LIKE %autocommit%;
每插入10000000行数据要5 minutes 左右。 所以插入80000000行记录需要 40 minutes 左右。此次执行实际用了60 minutes。
以下为上述执行过程的统计信息
[SQL]-- MySQL默认为自动提交 SHOW VARIABLES LIKE %autocommit%; 受影响的行: 0 时间: 0.001s [SQL] -- 设置当前会话不自动提交 SET SESSION autocommit=0; 受影响的行: 0 时间: 0.000s [SQL] SHOW VARIABLES LIKE %autocommit%; 受影响的行: 0 时间: 0.001s [SQL] -- 新插入八千万行数据 CALL insert_user(80000000); 受影响的行: 1 时间: 3632.734s [SQL] -- 提交 COMMIT; 受影响的行: 0 时间: 0.295s [SQL] -- 设置当前会话自动提交 SET SESSION autocommit=1; 受影响的行: 0 时间: 0.000s [SQL] SHOW VARIABLES LIKE %autocommit%; 受影响的行: 0 时间: 0.002s
