在MySQL数据库中,如果要插入上百万级的记录,用普通的insert into来操作非常不现实,速度慢人力成本高,推荐使用Load Data或存储过程来导入数据,我总结了一些方法分享如下,主要基于MyISAM和InnoDB引擎。

1 InnoDB存储引擎

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

1 > CREATE DATABASEecommerce;2 > USEecommerce;3 > CREATE TABLEemployees (4 id INT NOT NULL,5 fname VARCHAR(30),6 lname VARCHAR(30),7 birth TIMESTAMP,8 hired DATE NOT NULL DEFAULT '1970-01-01',9 separated DATE NOT NULL DEFAULT '9999-12-31',10 job_code INT NOT NULL,11 store_id INT NOT NULL

12 )13 partition BYRANGE (store_id) (14 partition p0 VALUES LESS THAN (10000),15 partition p1 VALUES LESS THAN (50000),16 partition p2 VALUES LESS THAN (100000),17 partition p3 VALUES LESS THAN (150000),18 Partition p4 VALUESLESS THAN MAXVALUE19 );

然后创建存储过程,其中,delimiter命令用来把语句定界符从;变为//,不然到declare var int;遇上第一个分号MySQL就错误停止:

> useecommerce;> DROP PROCEDURE BatchInser IF EXISTS;> 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

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

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

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

2 MyISAM存储引擎

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

> useecommerce;> CREATE TABLEecommerce.customer (

idINT NOT NULL,

emailVARCHAR(64) NOT NULL,

nameVARCHAR(32) NOT NULL,

passwordVARCHAR(32) NOT NULL,

phoneVARCHAR(13),

birth DATE,

sexINT(1),

avatar BLOB,

addressVARCHAR(64),

regtimeDATETIME,

lastipVARCHAR(15),

modifytimeTIMESTAMP NOT NULL,PRIMARY KEY(id)

) ENGINE= MyISAM ROW_FORMAT = DEFAULTpartitionBYRANGE (id) (

partition p0VALUES LESS THAN (100000),

partition p1VALUES LESS THAN (500000),

partition p2VALUES LESS THAN (1000000),

partition p3VALUES LESS THAN (1500000),

partition p4VALUES LESS THAN (2000000),

Partition p5VALUESLESS THAN MAXVALUE

);

再创建存储过程:

> useecommerce;> DROP PROCEDURE ecommerce.BatchInsertCustomer IF EXISTS;> 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

> delimiter ;

调用存储过程插入数据

> ALTER TABLEcustomer 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 TABLEtblname DISABLE KEYS;

loading the dataALTER TABLE tblname ENABLE KEYS;

这两个命令用来打开或者关闭MyISAM表非唯一索引的更新。在导入大量的数据到一个非空的MyISAM表时,通过设置这两个命令,可以提高导入的效率。对于导入大量 数据到一个空的MyISAM表,默认就是先导入数据然后才创建索引的,所以不用进行 设置。

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

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

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

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

文章转自:https://www.awaimai.com/841.html

关注微信公众号:lovephp

mysql 批量插入最大数量_MySQL批量插入大量数据方法相关推荐

  1. mysql批量修改学号位数_mysql批量修改表前缀

    如何快速批量修改文件名我们有时候在网页上,下载了好多自己喜欢的图片,一个个修改太麻烦了,想要快速 批量的修改文件名,其实,在你的 Windows 电脑上批量修改文件名...... 如何在 WPS 表格 ...

  2. mysql 备份大表 存储过程_mysql批量备份表的存储过程写法

    1.在工作会遇到这种情况,mysql数据库,系统涉及到备份多表数据,为了方便,用存储过程来实现此功能,同时也复习一下存储过程的写法,同时记录下方便以后扩展修改 2.存储过程代码如下 -- 创建存储过程 ...

  3. MySQL同步到hadoop工具_MySQL数据库实时同步数据到Hadoop分布式文件系统的工具Applier...

    通过Map/Reduce进行批处理递送到Apache Hadoop仍然是中枢环节.,但随着要从"超思维速度"分析方面获取竞争优势的压力递增,因此Hadoop( 分布式文件系统 )自 ...

  4. MySQL同步到hadoop工具_MySQL数据库实时同步数据到Hadoop分布式文件系统的工具Applier(转)...

    通过Map/Reduce进行批处理递送到Apache Hadoop仍然是中枢环节.,但随着要从"超思维速度"分析方面获取竞争优势的压力递增,因此Hadoop(分布式文件系统)自身经 ...

  5. mysql批量插入跟更新_Mysql批量插入和更新的性能-问答-阿里云开发者社区-阿里云...

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  6. mysql批量插入跟更新_Mysql批量插入和更新的性能

    利用Hibernate,连接池使用的是BoneCP,做了一个MySql批量插入和批量更新的Demo,出现了下面两个问题. 1.批量插入.我采用的是原生态的JDBC,每次批量插入60条数据左右(数据量不 ...

  7. mysql批量插入数据测试性能_mysql批量插入测试数据

    onethinkp导入excel /** * Excel导入函数 * @author crx349 */ if (!empty($_FILES)) { $config = array( 'maxSiz ...

  8. mysql导入100000000需要多久_MYSQL批量插入千万级数据只需百秒

    1.首先建立一张student表函数 create table(id int(20) NOT NULL AUTO_INCREMENT,sex char(1),name varchar(20));spa ...

  9. mysql批量更新报错_Mysql批量更新的三种方式

    前言 批量插入由于mysql的VALUES原生支持,使用较为便利. 批量更新的写法一般有三种,在更新数量较少的情况下,前两种性能不相上下.但是在更新字段增加,更新条数较多(500以上)建议使用第三种写 ...

  10. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...

最新文章

  1. 海量数据处理:从并发编程到分布式系统
  2. 《深入理解ES6》笔记——Set集合与Map集合(7)
  3. 呆呆键盘手11.14号学到的定位-实现滚动门效果
  4. Python字典的setdefault() 和get()方法比较
  5. SAP HANA,S/4HANA 和 SAP BTP 的辨析
  6. 3000字长文剖析!企业大数据到底是什么,从哪来,怎么用?
  7. 推荐系统遇上深度学习(一)--FM模型理论和实践
  8. 天地图专题一:加载天地图
  9. Spring Boot Maven 打包可执行Jar文件!
  10. android下图片压缩
  11. 小k娱乐网php,zblog仿小k资源模板Zblogphp系统精仿小k资源网主题模板面世啦!特惠福利...
  12. 痛并快乐着,我的程序世界
  13. MARKETS AND MARKET LOGIC——The Market‘s Principles (1)
  14. 几种编程语言的优缺点
  15. k-最近邻聚类k-Nearest Neighbor
  16. word隐藏段落标记,回车三角
  17. 初学编程最应该知道的8个学习方法,可惜之前没人告诉我……
  18. Self referencing loop detected with type的原因以及解决办法
  19. 跨越-丢掉你躯体内可怜的想法
  20. AI规则迎来进化:从“阿西莫夫三原则”到“李彦宏四原则”

热门文章

  1. html修改修改头像业务,修改头像.html
  2. 小米手机怎么按键测试软件,小米手机开机后出现工厂方式自动测试等等是什么意思...
  3. spss分析qpcr数据_手把手教你使用 SPSS 分析实时荧光定量数据
  4. 常用字典代码推荐标准
  5. 打印一只Nyan Cat(彩虹猫)(C++)
  6. 漫画 | 前端发展史的江湖恩怨情仇~
  7. ADMM之1范数理解
  8. ADMM algorithm
  9. 华为设备为(USG6000)的防火墙:配置远程管理防火墙最常见的几种方式。
  10. ADAMS2016启动证书错误解决