批量插入1000万条数据的三种方式对比

重要的写在前面的。如果你有更好的方法。希望您不吝啬您的留言。共同进步

一、直接导入
-- 查看允许mysql数据导出目录
SHOW VARIABLES LIKE "secure_file_priv";
SELECT * FROM demo INTO OUTFILE 'D:/up/prod.txt'
    FIELDS TERMINATED BY '\,' -- 字段的分隔符 这里是逗号
        OPTIONALLY ENCLOSED BY '\"'     -- 遇到像char varchar等类型的加上双引号
    LINES

        TERMINATED BY '\r\n'; -- 每条数据之后的处理方式 -- 3.353s


更多参数详情请查看mysql的API。

将文件存储到本地磁盘txt.然后通过mysql自带的导入向导导入数据。    -- 620.922s

二、存储过程
--  存储过程循环拼接,成一条insert。并且最好设置一下每一千条提交一次(都有利于提高插入速度)-- 256
CREATE PROCEDURE sp2(IN i INT)
BEGIN
-- set something
DECLARE a,b INT;
DECLARE  v_start_time  datetime;
  SET v_start_time  :=now();
SET a :=0;
SET b := i;
set @exesql = concat("insert into demo(`value`) values ");
set @exedata = "";
-- do something
-- DELETE FROM demo WHERE `key` > a;
WHILE a < b DO
SET @exedata = concat(@exedata, ",('", a, "')");
SET a := a+1;
IF a%1000=0 THEN -- 1000条插入一次
set @exedata = SUBSTRING(@exedata, 2);
set @exesql = concat("insert into demo(`value`) values ", @exedata);
prepare stmt from @exesql;
execute stmt;
DEALLOCATE prepare stmt;
set @exedata = "";
COMMIT;
END IF;
-- INSERT INTO demo(`value`) VALUES(a);
-- SET a := a+1;
END WHILE;
IF length(@exedata)>0 THEN
set @exedata = SUBSTRING(@exedata, 2);
set @exesql = concat("insert into demo(`value`) values ", @exedata);
prepare stmt from @exesql;
execute stmt;
DEALLOCATE prepare stmt;
set @exedata = "";
COMMIT;
END IF;
SELECT concat('耗时:', unix_timestamp(now()) - unix_timestamp(v_start_time), '秒!');
END

三、LOAD DATA INFILE
-- LOAD DATA INFILE语句用于高速地从一个文本文件中读取行,并装入一个表中。文件名称必须为一个文字字符串。
load data local infile "D:/up/prod.txt" into table demo 
FIELDS TERMINATED BY '\,'
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY '\r\n'; -- 29.611s
更多参数详情请查看mysql的API。


-- 总结
1、INSERT INTO workinfo (column3, column13) VALUES (1, 2), (2, 3),(4,5),这样可以减少一些INSERT语句
2、可以考虑用LOAD DATA INFILE
3、适当调大bulk_insert_buffer_size参数
4、插入前执行锁表操作LOCK TABLES workinfo WRITE,插入完成后UNLOCK TABLES
5、插入数据前ALTER TABLE workinfo DISABLE KEYS避免更新索引结构,插入完成后再ALTER TABLE workinfo ENABLE KEYS
6、并行插入,不过推荐多线程并行插入
7、存储引擎MyISAM对于大批量数据的INSERT更快点

你可能感兴趣的:(学习)