mysql批量添加数据sql语句_sql insert into 批量

mysql批量添加数据sql语句_sql insert into 批量在MySQL数据库中,如果要插入上百万级的记录,用普通的insertinto来操作非常不现实,速度慢人力成本高,推荐使用LoadData或存储过程来导入数据,我总结了一些方法分享如下,主要基于MyISAM和InnoDB引擎。1InnoDB存储引擎首先创建数据表(可选),如果有了略过:1>CREATEDATABASEecommerce;2>USEecommerce;3&…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

在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

c045a5c6bf108328feed7f3747276bda.png

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185687.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • Typescript教程_安装typescript

    Typescript教程_安装typescript前言由于最近在使用vue3写项目,使用vue3的前提就是要学习TypeScript,TypeScript算是JavaScript的升级版,TypeScript包含JavaScript和自己的一些特性

  • phpMyAdmin安装配置教程「建议收藏」

    phpMyAdmin安装配置教程「建议收藏」phpMyAdmin就是一种MySQL的管理工具,安装该工具后,即可以通过Web形式直接管理MySQL数据库,不需要通过执行系统命令来管理,非常适合对数据库操作命令不熟悉的数据库管理者。一、我们从phpMyAdmin官网上下载该软件,然后将该软件压缩放置xampp目录下。​二、复制PHP文件config.sample.inc文件并改名为config.inc,并做如下修改:​注意:因为XAMPP包含了Apache、MySQL、PHP、PERL,它在安装时

  • 统一登录的基本原理

    请参考OAuth2.0的相关文章,OAuth2.0我更愿意称为第三方安全认证登录。而“统一登录”是自有系统的一次性用户名、密码验证,各系统间跳转,不再需要用户名密码验证。基本原理如下图。上图中的OAuthToken,只是一个随机串,例如MoRHmjRfdpUNWvOon5RfZ4COnd81Uz6N注意:假设各应用系统的域名分别如下a.test.comb.test.comc.test

  • 安卓udp发包工具_好装逼牌udp-tcp发包工具

    安卓udp发包工具_好装逼牌udp-tcp发包工具这是好装逼牌udp-tcp发包工具,界面看着好像很牛逼,是不是草包自己实验吧,听说可以穿透安全狗和金盾冰盾之类的防火墙,黑软有风险使用需谨慎,不过玩黑软也有好处,有可能警察叔叔会帮你解决住房问题和吃住问题==!你懂吗?软件特点1.可收发TCP/UDP数据。2.对于TCP,支持服务器和客户端模式。3.支持多连接,可同时对多路网络连接进行操作。4.对于UDP,支持组播方式。5.可显示当前数据传输速度…

  • 从贝叶斯方法谈到贝叶斯网络语言_深度贝叶斯网络

    从贝叶斯方法谈到贝叶斯网络语言_深度贝叶斯网络从贝叶斯方法谈到贝叶斯网络0引言事实上,介绍贝叶斯定理、贝叶斯方法、贝叶斯推断的资料、书籍不少,比如《数理统计学简史》,以及《统计决策论及贝叶斯分析JamesO.Berger著》等等,然介绍贝叶斯网络的中文资料则非常少,中文书籍总共也没几本,有的多是英文资料,但初学者一上来就扔给他一堆英文论文,因无基础和语言的障碍而读得异常吃力导致无法继续读下去则是非…

    2022年10月19日
  • 大二C#实现酒店管理系统(C端展示、前台操作、登记入住、入住管理、职位管理、公告系统等)「建议收藏」

    大二C#实现酒店管理系统(C端展示、前台操作、登记入住、入住管理、职位管理、公告系统等)「建议收藏」大二C#项目作业,这个项目做为毕设都不是问题

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号