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

说明:

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

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

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

创建存储过程

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

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

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

用时:3h 37min 8sec
二、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;

用时: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,关闭自动 提交,导入结束后再执行

时间: 2024-09-02 01:59:32

mysql快速保存插入大量数据一些方法总结的相关文章

关于mysql使用存储过程插入大量数据的问题

问题描述 关于mysql使用存储过程插入大量数据的问题 创建数据库 create database ceshi; use ceshi; 创建表 create table ce( id int not null auto_increment, name varchar(50) default null, pw char(50), primary key(id)); 存储过程 delimiter // create procedure insert_ce(in item int) begin dec

MySQL 文本文件的导入导出数据的方法_Mysql

MySQL写入数据通常用insert语句,如 复制代码 代码如下: insert into person values(张三,20),(李四,21),(王五,70)-; 但有时为了更快速地插入大批量数据或交换数据,需要从文本中导入数据或导出数据到文本. 一. 建立测试表,准备数据 首先建立一个用于测试的表示学生信息的表,字段有id.姓名.年龄.城市.薪水.Id和姓名不 能为空. 复制代码 代码如下: create table person( id int not null auto_increm

win8系统下保存历史文件数据的方法

  小编就来教大家win8电脑中如何使用文件历史数据进行保存文件. win8系统下保存历史文件数据的方法教程 1.打开电脑之后,咱们直接按下快捷键win+i,这样就会弹出一个设置界面,咱们直接选择设置中的控制面板功能. 2.在控制面板的界面中,咱们找到并选中系统和安全下的"通过文件历史记录保存你的文件备份副本"选项. 3.接下来需要咱们选择一个盘或者是移动设备来存储这些东西,这里需要说明的是,由于文件可能很大,所以小编建议大家选择8G及以上的存储盘来保存文件.选择好之后,点击页面中的启

php连接odbc数据源并保存与查询数据的方法_php技巧

本文实例讲述了php连接odbc数据源并保存与查询数据的方法.分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: $connstr = "driver=microsoft access driver (*.mdb);dbq=".realpath("db.mdb");     $connid = odbc_connect($connstr,"","",sql_cur_use_odbc); $odbc_exec =

Android采用File形式保存与读取数据的方法_Android

本文实例讲述了Android采用File形式保存与读取数据的方法.分享给大家供大家参考,具体如下: 将数据直接以文件的形式保存在设备中,通过Context.openFileInput()方法获得标准的JAVA文件输入流(FileInputStream),通过Context.openFileOutput()方法获得标准的JAVA文件输出流(FileOutputStream) 写数据到file文件中 findViewById(R.id.file).setOnClickListener(new But

Android采用File形式保存与读取数据的方法

本文实例讲述了Android采用File形式保存与读取数据的方法.分享给大家供大家参考,具体如下: 将数据直接以文件的形式保存在设备中,通过Context.openFileInput()方法获得标准的JAVA文件输入流(FileInputStream),通过Context.openFileOutput()方法获得标准的JAVA文件输出流(FileOutputStream) 写数据到file文件中 findViewById(R.id.file).setOnClickListener(new But

使用JDBC4.0操作XML类型的字段(保存获取xml数据)的方法_java

在 Java SE 6 所提供的诸多新特性和改进中,值得一提的是为 Java 程序提供数据库访问机制的 JDBC 版本升级到了 4.0, 这个以 JSR-221 为代号的版本 , 提供了更加便利的代码编写机制及柔性 , 并且支持更多的数据类型 . JDBC 4.0 的新特性分为下述四类: 1. 驱动及连接管理 2. 异常处理 3. 数据类型支持 4. API 的变化 以上说这么都不是本文要讲的重点内容,下面给大家介绍jdbc4.0操作xml类型数据的方法,具体详情如下所示: 在JDBC4.0推出

MySQL误操作后快速恢复数据的方法_Mysql

摘要: 利用binlog闪回误操作数据. 基本上每个跟数据库打交道的程序员(当然也可能是你同事)都会碰一个问题,MySQL误操作后如何快速回滚?比如,delete一张表,忘加限制条件,整张表没了.假如这还是线上环境核心业务数据,那这事就闹大了.误操作后,能快速回滚数据是非常重要的. 传统解法 用全量备份重搭实例,再利用增量binlog备份,恢复到误操作之前的状态.然后跳过误操作的SQL,再继续应用binlog.此法费时费力,不值得再推荐. 利用binlog2sql快速闪回 首先,确认你的MySQ

急救:jsp向mysql数据库中插入中文数据时是乱码

问题描述 mysql当初安装的时候采用的编码是utf-8我建立的数据库编码是gbk_chinese_ciJSP文件:<%@pagelanguage="java"contentType="text/html;charset=GBK"%><html><head><title>编码问题</title><metahttp-equiv="Content-Type"content="