在MySQL数据库中,如果要批量插入数据(特别是上百万级超大数据),

用普通的insert into来操作非常不现实,速度慢人力成本高,

推荐使用Load Data或存储过程来导入数据,

我总结了一些方法分享如下,主要基于MyISAM和InnoDB引擎。

1 InnoDB存储引擎

首先创建数据表(可选),如果有了略过:

> CREATE DATABASE ecommerce;

> USE ecommerce;

> CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

birth TIMESTAMP,

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT NOT NULL,

store_id INT NOT NULL

)

partition BY RANGE (store_id) (

partition p0 VALUES LESS THAN (10000),

partition p1 VALUES LESS THAN (50000),

partition p2 VALUES LESS THAN (100000),

partition p3 VALUES LESS THAN (150000),

Partition p4 VALUES LESS THAN MAXVALUE

);

然后创建存储过程,其中,delimiter命令用来把语句定界符从;变为//,

不然到declare var int;遇上第一个分号MySQL就错误停止:

> use ecommerce;

> DROP PROCEDURE IF EXISTS BatchInser;

> delimiter // -- 把界定符改成双斜杠

> CREATE PROCEDURE BatchInsert(IN init INT, IN loop_time INT) -- 第一个参数为初始ID号(可自定义),第二个位生成MySQL记录个数

BEGIN

DECLARE Var INT;

DECLARE ID INT;

SET Var = 0;

SET ID = init;

WHILE Var < loop_time DO

insert into employees(id, fname, lname, birth, hired, separated, job_code, store_id) values (ID, CONCAT('chen', ID), CONCAT('haixiang', ID), Now(), Now(), Now(), 1, ID);

SET ID = ID + 1;

SET Var = Var + 1;

END WHILE;

END;

//

> delimiter ; -- 界定符改回分号

> CALL BatchInsert(30036, 200000); -- 调用存储过程插入函数

也可以把上面的内容(除了语句之前的>号)复制到MySQL查询框中执行。

2 MyISAM存储引擎

首先创建数据表(可选):

> use ecommerce;

> CREATE TABLE ecommerce.customer (

id INT NOT NULL,

email VARCHAR(64) NOT NULL,

name VARCHAR(32) NOT NULL,

password VARCHAR(32) NOT NULL,

phone VARCHAR(13),

birth DATE,

sex INT(1),

avatar BLOB,

address VARCHAR(64),

regtime DATETIME,

lastip VARCHAR(15),

modifytime TIMESTAMP NOT NULL,

PRIMARY KEY (id)

) ENGINE = MyISAM ROW_FORMAT = DEFAULT

partition BY RANGE (id) (

partition p0 VALUES LESS THAN (100000),

partition p1 VALUES LESS THAN (500000),

partition p2 VALUES LESS THAN (1000000),

partition p3 VALUES LESS THAN (1500000),

partition p4 VALUES LESS THAN (2000000),

Partition p5 VALUES LESS THAN MAXVALUE

);

再创建存储过程:

> use ecommerce;

> DROP PROCEDURE IF EXISTS ecommerce.BatchInsertCustomer;

> delimiter //

> CREATE PROCEDURE BatchInsertCustomer(IN start INT,IN loop_time INT)

BEGIN

DECLARE Var INT;

DECLARE ID INT;

SET Var = 0;

SET ID= start;

WHILE Var < loop_time DO

insert into customer(ID, email, name, password, phone, birth, sex, avatar, address, regtime, lastip, modifytime)

values (ID, CONCAT(ID, '@sina.com'), CONCAT('name_', rand(ID)*10000 mod 200), 123456, 13800000000, adddate('1995-01-01', (rand(ID)*36520) mod 3652), Var%2, 'http:///it/u=2267714161, 58787848&fm=52&gp=0.jpg', '北京市海淀区', adddate('1995-01-01', (rand(ID)*36520) mod 3652), '8.8.8.8', adddate('1995-01-01', (rand(ID)*36520) mod 3652));

SET Var = Var + 1;

SET ID= ID + 1;

END WHILE;

END;

//

> delimiter ;

调用存储过程插入数据

> ALTER TABLE customer DISABLE KEYS;

> CALL BatchInsertCustomer(1, 2000000);

> ALTER TABLE customer ENABLE KEYS;

通过以上对比发现对于插入大量数据时可以使用MyISAM存储引擎,如果再需要修改MySQL存储引擎可以使用命令:

ALTER TABLE ecommerce ENGINE = MYISAM;

3 关于批量插入

很久很久以前,为了写某个程序,必须在MySQL数据库中插入大量的数据,一共有85766121条。

近一亿条的数据,怎么才能快速插入到MySQL里呢?

当时的做法是用INSERT INTO一条一条地插入,Navicat 估算需要十几个小时的时间才能完成,就放弃了。

最近几天学习了一下MySQL,提高数据插入效率的基本原则如下:

批量插入数据的效率比单数据行插入的效率高

插入无索引的数据表比插入有索引的数据表快一些

较短的SQL语句的数据插入比较长的语句快

这些因素有些看上去是微不足道的,但是如果插入大量的数据,即使很小的影响效率的因素也会形成不同的结果。

根据上面讨论的规则,我们可以就如何快速地加载数据得出几个实用的结论。

使用LOAD DATA语句要比INSERT语句效率高,因为它批量插入数据行。服务器只需要对一个语句(而不是多个语句)进行语法分析和解释。索引只有在所有数据行处理完之后才需要刷新,而不是每处理一行都刷新。

如果你只能使用INSERT语句,那就要使用将多个数据行在一个语句中给出的格式:INSERT INTO table_name VALUES(...),(...),...,这将会减少你需要的语句总数,最大程度地减少了索引刷新的次数。

根据上面的结论,今天又对相同的数据和数据表进行了测试,

发现用LOAD DATA速度快了不只是一点点,竟然只用了十多分钟!

所以在MySQL需要快速插入大量数据时,LOAD DATA是你不二的选择。

顺便说一下,在默认情况下,LOAD DATA语句将假设各数据列的值以制表符(t)分隔,

各数据行以换行符(n)分隔,数据值的排列顺序与各数据列在数据表里的先后顺序一致。

但你完全可以用它来读取其他格式的数据文件或者按其他顺序来读取各数据列的值,有关细节请参照MySQL文档。

4 总结

1. 对于Myisam类型的表,可以通过以下方式快速的导入大量的数据。

ALTER TABLE tblname DISABLE KEYS;

loading the data

ALTER TABLE tblname ENABLE KEYS;

这两个命令用来打开或者关闭MyISAM表非唯一索引的更新。

在导入大量的数据到一个非空的MyISAM表时,通过设置这两个命令,可以提高导入的效率。

对于导入大量 数据到一个空的MyISAM表,默认就是先导入数据然后才创建索引的,所以不用进行 设置。

2. 而对于Innodb类型的表,这种方式并不能提高导入数据的效率。对于Innodb类型的表,我们有以下几种方式可以提高导入的效率:

因为Innodb类型的表是按照主键的顺序保存的,所以将导入的数据按照主键的顺序排列,可以有效的提高导入数据的效率。如果Innodb表没有主键,那么系统会默认创建一个内部列作为主键,所以如果可以给表创建一个主键,将可以利用这个优势提高 导入数据的效率。

在导入数据前执行SET  UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET  UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。

如果应用使用自动提交的方式,建议在导入前执行SET  AUTOCOMMIT=0,关闭自动提交,导入结束后再执行

参考资料:http://www.111cn.net/database/mysql/53274.htm

mysqlplus 批量插入_mysql批量插入相关推荐

  1. mysql中sql批量插入_MySQL批量SQL插入性能优化

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长. 特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的 ...

  2. mybatis mysql 批量更新_mysql批量update更新,mybatis中批量更新操作

    在日常开发中,有时候会遇到批量更新操作,这时候最普通的写法就是循环遍历,然后一条一条地进行update操作.但是不管是在服务端进行遍历,还是在sql代码中进行遍历,都很耗费资源,而且性能比较差,容易造 ...

  3. mysql数据库语句插入_MySQL之插入数据(添加数据)-INSERT

    基本语法: INSERT 语句有两种语法形式,分别是 INSERT-VALUES 语句和 INSERT-SET 语句. 1.INSERT...VLAUES语句 INSERT VLAUES的语法格式如下 ...

  4. mysqlplus 批量插入_MySQL批量插入数据

    MySQL插入多条数据有二种方法,一种是写多条insert语句,再用逗号;分割每条语句,另外一种是用insert一次性赋多个值. 1 多条语句 写多条insert,用同数量的;号隔开,让MySQL执行 ...

  5. mysql不存在就批量新增_mysql批量插入,存在则修改,不存在则插入

    批量插入,存在则修改,不存在则插入 INSERT INTO 表名 (字段1,字段2,字段3,字段4) VALUES (字段1值,字段2值,字段3值,字段4值) ON DUPLICATE KEY UPD ...

  6. mysql 文件批量插入_mysql大批量插入数据的4种方法示例

    前言 本文主要给大家介绍了关于mysql大批量插入数据的4种方法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 方法一:循环插入 这个也是最普通的方式,如果数据量不是很大,可以使用, ...

  7. sql加上唯一索引后批量插入_MySQL批量插入遇上唯一索引避免方法

    一.背景 以前使用SQL Server进行表分区的时候就碰到很多关于唯一索引的问题:Step8:SQL Server 当表分区遇上唯一约束,没想到在MySQL的分区中一样会遇到这样的问题:MySQL表 ...

  8. mysql sql批量插入_mysql批量插入数据的纯sql脚本

    引用 13.2.5. LOAD DATA INFILE语法 LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [ ...

  9. mysql数据库批量编码_MySQL批量修改数据库的编码类型

    --修改表编码 select concat('alter table ', table_schema, '.', table_name, ' charset=\'gbk\';') from Table ...

最新文章

  1. 「预训练-调优」范式的未来
  2. 【多进程并行版本】爬取链家二手房前100页标签,进行统计
  3. webpack4.x中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
  4. 按键精灵定义全局变量_按键精灵中如何定义和使用变量
  5. 【白皮书】中国高端制造投融资白皮书.pdf(附下载链接)
  6. 红色警戒2修改器原理百科(八)
  7. 武林传奇之七剑下天山java游戏开发商_武林传奇之七剑下天山
  8. C语言基础之5:运算符、表达式和语句
  9. CSS盒子模式之四 - 绝对定位和相对定位
  10. php mysql 开发成本_Java凭什么比PHP+MYSQL开发的B2B软件值钱
  11. Docker全环境操作手册(更新中)
  12. 零相位滤波matlab,什么叫零相位滤波器(最小相位滤波器)
  13. JDBC的URL详解
  14. 自学SQL网习题答案
  15. 第七十四篇:机器学习优化方法及超参数设置综述
  16. matlab 画偏振态,MATLAB:绘制三维偏振光动画
  17. 图像处理之平滑滤波、高斯滤波和中值滤波
  18. 2021年12月1日
  19. 算法题练习:棋盘放麦子
  20. 悦享数据-企业级API数据服务

热门文章

  1. php 公众号队列推送,微信消息推送
  2. 关于安卓19的板子通过usb连接打印机打印问题 (非小票打印机器)
  3. 面视必备,史上最通俗计算机网络分层详解
  4. Android线程与线程池
  5. linux下如何查看test点txt,Linuxtest - (1.doc
  6. 碧蓝航线账号服务器查询,碧蓝航线哔哩哔哩账号登录弃坑一段时间后再登陆以前充的钱没了怎么办(所有数据都没了)...
  7. 基于云存储的个人笔记项目
  8. ftp自动登录服务器
  9. 搭建springboot应用,运行报错:Failed to configure a DataSource: ‘url‘ attribute is not specified and no embedd
  10. 深入浅出讲解Optional包装类