mysql快速保存插入大量数据一些方法总结

摘要:
声明;MySQL将停止˃CREATE PROCEDURE BatchInsert BEGINDECLAREVarINT;DECLAREIDINT;设置变量=0;SETID=初始化;WHILEVar分隔符;将分隔符改回;调用存储过程以插入数据。代码如下:1˃CALLBatchInsert;时间:3h37min8sec II。MyISAM存储引擎创建表代码如下:1˃usecommerce;˃创建电子商务。customerENGINE=MyISAMROW_ FORMAT=DEFAULTpartitionBYRANGE;按如下方式创建存储过程代码:1˃usecommerce;˃DROPPROCEDUREIFEXITS电子商务。批次插入客户;˃分隔符//˃CREATEPROCEDUREBatchInsertCustomerBEGINDECLAREVarINT;DECLAREIDINT;设置变量=0;SETID=启动;WHILEVar分隔符;用于调用存储过程以插入数据的代码如下:1˃ALTERABLEcustomerDISABLEKEYS;˃呼叫批次插入客户;˃备选客户支持密钥;时间:8分钟50秒通过以上比较,发现在插入大量数据时可以使用MyISAM存储引擎。如果需要再次修改MySQL存储引擎,可以使用命令:ALTERABLEtENGINE=MYISAM;另一个文件很久以前,为了编写程序,必须将大量数据插入MySQL数据库。共有85766121个条目。如何快速将近1亿条数据插入MySQL?

转载:http://www.111cn.net/database/mysql/53274.htm

说明:

这几天尝试了使用不同的存储引擎大量插入MySQL表数据,主要试验了MyISAM存储引擎和InnoDB。下面是实验过程:

实现:
一、InnoDB存储引擎。
创建数据库和表

代码如下
1> CREATE DATABASE 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
);

创建存储过程

代码如下
1> use ecommerce;
> delimiter // delimiter命令来把语句定界符从;变为//,不然后面的存储过程会出错。到declare var int;mysql就停止
> CREATE PROCEDURE BatchInsert(IN init INT, IN loop_time INT)
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 ;

把定界符变回;
调用存储过程插入数据

代码如下
1> CALL BatchInsert(30036,200000);

用时:3h 37min 8sec
二、MyISAM存储引擎
创建表

代码如下
1> 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
);

创建存储过程

代码如下
1> 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 ;

调用存储过程插入数据

代码如下
1> ALTER TABLE customer DISABLE KEYS;
> CALL BatchInsertCustomer(1,2000000);
> ALTER TABLE customer ENABLE KEYS;

用时:8min 50sec
通过以上对比发现对于插入大量数据时可以使用MyISAM存储引擎,如果再需要修改MySQL存储引擎可以使用命令:
ALTER TABLE t ENGINE = MYISAM;

另一文件

很久很久以前,为了写某个程序,必须在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文档。

总结

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

ALTER TABLE tblname DISABLE KEYS;

loading the data

ALTER TABLE tblname ENABLE KEYS;

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

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

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

b. 在导入数据前执行SET UNIQUE_CHECKS=0,关闭唯一性校验,在导入结束后执行SET UNIQUE_CHECKS=1,恢复唯一性校验,可以提高导入的效率。
c. 如果应用使用自动提交的方式,建议在导入前执行SET AUTOCOMMIT=0,关闭自动 提交,导入结束后再执行

免责声明:文章转载自《mysql快速保存插入大量数据一些方法总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇H3C配置qt 界面去掉系统边框2.0版下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C语言操作mysql

php中 mysqli, pdo 可以用 mysqlnd 或 libmysqlclient 实现 前者 从 php 5.3.0起已内置到php中, 并且支持更多的特性,推荐用 mysqlnd mysqlnd , libmysqlclient 对比:http://php.net/manual/en/mysqlinfo.library.choosing.ph...

系统综合实践 第2次实践作业 ——学习Dockerfile

目录 (一)实现一个自定义的web容器服务 (1)镜像拉取 (2)配置文件 (3)镜像构建及容器运行 (二) 实现一个自定义的数据库容器服务 (1)拉取镜像 (2)配置文件 (3)镜像构建及容器运行 (4)mysql基本操作 (三) 心得体会 (一)实现一个自定义的web容器服务 要求:推荐apache或nginx,要求标明镜像作者...

CentOS7安装MySQL8.0图文教程

1.下载 MySQL 所需要的安装包         网址:https://dev.mysql.com/downloads/mysql/   2.Select Operating System: 选择 Red Hat ,CentOS 是基于红帽的,Select OS Version: 选择 linux 7   3.选择 RPM Bundle 点击 Down...

mac下mysqldump找不到命令

之所以会出现MySQL或者mysqldump这样的命令找不到, 我们可以打开/usr/bin文件夹,发现bin目录中并没有mysql打头的UEF文件, 而在/usr/local/mysql/bin中可以找到这样的文件, 说明mysql的命令默认安装路径是不在bin目录中的, 因而我们需要在环境变量中配置mysql的所有命令,按照如下步骤 打开termina...

MySQL8.0新增配置参数

activate_all_roles_on_login 此参数在版本8.0.2引入,是一个可以动态调整的global级参数,默认值为OFF。此参数用于控制在账户登录时是否激活已经授予的角色,如果为ON则授予的角色会被激活,设置为OFF时只能通过SET DEFAULT ROLE显式激活用户角色。activate_all_roles_on_login设置只在账...

php : mysql数据库操作类演示

设计目标:  1,该类一实例化,就可以自动连接上mysql数据库;  2,该类可以单独去设定要使用的连接编码(set names XXX)  3,该类可以单独去设定要使用的数据库(use XXX);  4,可以主动关闭连接; <?php /* 设计一个类:mysql数据库操作类 设计目标: 1,该类一实例化,就可以自动连接上mysql数据库...