MySQL 快速构造一亿条记录的表

时间:2022-01-25 16:02:51

在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:http://blog.csdn.net/mchdba/article/details/52938114,但是因为录入一亿表需要2个小时,所以还是感觉速度慢了些,那有没有啥办法能加快这一步骤呢?

 

1、建一张通用的用户表

建用户表没有啥变化,还是和上次一样。

USE test;

CREATE TABLE `UC_USER` (

`ID` BIGINT (20),

`USER_NAME` VARCHAR (400),

`USER_PWD` VARCHAR (800),

`BIRTHDAY` DATETIME ,

`NAME` VARCHAR (800),

`USER_ICON` VARCHAR (2000),

`SEX` CHAR (4),

`NICKNAME` VARCHAR (800),

`STAT` VARCHAR (40),

`USER_MALL` BIGINT (20),

`LAST_LOGIN_DATE` DATETIME ,

`LAST_LOGIN_IP` VARCHAR (400),

`SRC_OPEN_USER_ID` BIGINT (20),

`EMAIL` VARCHAR (800),

`MOBILE` VARCHAR (200),

`IS_DEL` CHAR (4),

`IS_EMAIL_CONFIRMED` VARCHAR (4),

`IS_PHONE_CONFIRMED` VARCHAR (4),

`CREATER` BIGINT (20),

`CREATE_DATE` DATETIME ,

`UPDATE_DATE` DATETIME ,

`PWD_INTENSITY` VARCHAR (4),

`MOBILE_TGC` VARCHAR (256),

`MAC` VARCHAR (256),

`SOURCE` VARCHAR (4),

`ACTIVATE` VARCHAR (4),

`ACTIVATE_TYPE` VARCHAR (4),

`IS_LIFE` VARCHAR (4)

) ENGINE=INNODB;

2、优化录数据的存储过程

这里有变化了,设置了set autocommit=0;了,这样不用每次insert就commit一次,实现了30W后insert然后进行commit,这样就是批量提交,提高了数据写效率。

而且在执行commit的时候,为了验证是否批量提交,就做了有小验证,而且验证的信息写入到临时日志表里面uc_log表去,uc_log表结构如下:

CREATE TABLE `uc_log` (
  `msg` varchar(1000) DEFAULT NULL comment ‘提交信息记录’,
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

存储过程内容:

DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS `pro_test_data_1`$$

CREATE DEFINER=`dev_user`@`%` PROCEDURE `pro_test_data_1`( pos_begin INT,pos_end INT)

BEGIN

DECLARE i INT;

SET i=pos_begin;

SET AUTOCOMMIT=0;

WHILE  i>=pos_begin && i<= pos_end DO

INSERT INTO test.`UC_USER_1` (`ID`, `USER_NAME`, `USER_PWD`, `BIRTHDAY`, `NAME`, `USER_ICON`, `SEX`, `NICKNAME`, `STAT`, `USER_MALL`, `LAST_LOGIN_DATE`, `LAST_LOGIN_IP`, `SRC_OPEN_USER_ID`, `EMAIL`, `MOBILE`, `IS_DEL`, `IS_EMAIL_CONFIRMED`, `IS_PHONE_CONFIRMED`, `CREATER`, `CREATE_DATE`, `UPDATE_DATE`, `PWD_INTENSITY`, `MOBILE_TGC`, `MAC`, `SOURCE`, `ACTIVATE`, `ACTIVATE_TYPE`, `IS_LIFE`) VALUES(i,'admin','1ba613b3676a4a06d6204b407856f374',NOW(),'超管','group1/M00/03/BC/wKi0d1QkFaWAHhEwAAAoJ58qOcg271.jpg','1','admin2014','01','1',NOW(),'192.168.121.103',NULL,'','10099990001','0','1','0',NULL,NULL,NULL,'1','E5F10CAA4EBB44C4B23726CBBD3AC413','1-3','0','2','2','1');

SET i=i + 1;  # 接下来判断30W一批次就commit一回。

IF MOD(i,300000)<=0 THEN

INSERT INTO test.uc_log(id,msg)VALUES(i,'begin to commmit a group insert sql data.');

COMMIT;

END IF;

END WHILE;

END$$

DELIMITER ;

Blog来源地址: http://blog.csdn.net/mchdba/article/details/52987852,博主mchdba(黄杉),谢绝转载

3、录入数据忽略binlog

开始启用存储过程录入一亿条数据进表,命令call test.pro_test_data(0,100000000);,这里时间会比较长一些,毕竟是一亿条记录。

# 录入数据的时候,不写入binlog,加快数据录入

mysql> set sql_log_bin=0;

Query OK, 0 rows affected (0.00 sec)

mysql>

mysql> call test.pro_test_data_1(0,100000000);

Query OK, 1 row affected (1 hour 37 min34.57 sec)   # 看到用时是1 hours 37 min 34.57 sec,1个半小时左右。

mysql>

mysql> select count(1) from test.`UC_USER_1`;

+-----------+

| count(1)  |

+-----------+

| 100000001 |

+-----------+

1 row in set (3 min 0.14 sec)

mysql>

MySQL 快速构造一亿条记录的表的更多相关文章

  1. mysql快速导入5000万条数据过程记录&lpar;LOAD DATA INFILE方式&rpar;

    mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式) 首先将要导入的数据文件top5000W.txt放入到数据库数据目录/var/local/mysql/data/${d ...

  2. 清理8组nodes中表的历史数据,平均每个node中的表有1&period;5亿条记录,需要根据date&lowbar;created字段清理8000W数据记录,这个字段没有索引。

    清理8组nodes中表的历史数据,平均每个node中的表有1.5亿条记录,需要根据date_created字段清理8000W数据记录,这个字段没有索引. 环境介绍  线上磁盘空间不足,truncate ...

  3. 【面经】面试官:如何以最高的效率从MySQL中随机查询一条记录?

    写在前面 MySQL数据库在互联网行业使用的比较多,有些小伙伴可能会认为MySQL数据库比较小,存储不了很多的数据.其实,这些小伙伴是真的不了解MySQL.MySQL的小不是说使用MySQL存储的数据 ...

  4. MySQL使用INSERT插入多条记录

    MySQL使用INSERT插入多条记录,应该如何操作呢?下面就为您详细介绍MySQL使用INSERT插入多条记录的实现方法,供您参考. 看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语 ...

  5. AX 插入一条记录提示表记录已经存在,但是该记录实际上是不存在的。

    做测试的时候遇到一个情况"AX 插入一条记录提示表记录已经存在,但是该记录实际上是不存在的." 检查到该表(TABLE_ABC)所有的key都是AllowDuplicate的, 继 ...

  6. mysql 造1亿条记录的单表--大数据表

    读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXI ...

  7. 如何在十分钟内插入1亿条记录到Oracle数据库?

    这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR ...

  8. python 往mysql数据库中插入多条记录。

    最近想写mysql库,用到insert into语句,如何一次性将多条记录插入库表中呢. MySQLdb提供了两个执行语句的方法:一个是execute(),另一个是executemany() exec ...

  9. mongodb索引--1亿条记录的查询从55&period;7秒到毫秒级别&lt&semi;补充版&gt&semi;

    从头开始,验证mongodb的索引的好处.(window7环境下) 下载mongodb服务器,并解压到d盘,并使用以下命令启动 mongod --dbpath D:\mongodb\data mong ...

随机推荐

  1. nodejs创建http服务器

    之前有简单介绍nodejs的一篇文章(http://www.cnblogs.com/fangsmile/p/6226044.html) HTTP服务器 Node内建有一个模块,利用它可以很容易创建基本 ...

  2. freemarker页面中文乱码

    一.前言 简单的记录freemarker遇到的错误问题:ftl页面中文乱码 由于freemarker整合在ssm框架中,所以笔者直接贴配置代码 <beans xmlns="http:/ ...

  3. 移动端 h5调试技巧

    一 安卓 一 chrome 1.安卓手机安装chrome浏览器,手机打开开发者模式,用usb线链接电脑,并且允许调试. 2.电脑chrome地址栏输入 chrome://inspect 进入后点击 i ...

  4. Linux Svn 安装过程及配置

    重要的是第一步的安装,第二步配置可能没用,但是没试过,因为服务器上已经安装了第一步. 此处的第二步只为做个记录,说明一下里边的配置文件的用途. 3. 自己实际操作中的的配置记录(参照服务器别人的配置记 ...

  5. OC中UITabBarController控制器

    UITabBarController UITabBarController(记为O)常用于管理多个导航控制器,例如有ABC三个导航控制器,可以:addChildViewController(记为A), ...

  6. FireDac 与数据库连接时字符集及对应的字段类型问题

    近日在一个过程调用时发生一个奇怪现象, 异常返回意思是说, 数据的长度是[6], 而字段定义的长度是[3].  分析后认为:  调用过程你不涉及到对返回数据集的字段手动定义问题, 出现这个问题应是两边 ...

  7. 4&period; powerdesigner 生成sql脚本步骤

    1. 选择数据库类型:DataBase(数据库)-- Change Current DBMS 2. 生成数据库脚本:DataBase(数据库)--generate Database

  8. POJ3304&lpar;KB13-C 计算几何&rpar;

    Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15335   Accepted: 4862 Descrip ...

  9. Codeforces 946D Timetable(预处理&plus;分组背包)

    题目链接:http://codeforces.com/problemset/problem/946/D 题目大意:有n个字符串,代表n天的课表,1表示这个时间要上课,0表示不要上课,一天在学校时间为第 ...

  10. Django实战(10):单元测试

    尽早进行单元测试(UnitTest)是比较好的做法,极端的情况甚至强调“测试先行”.现在我们已经有了第一个model类和Form类,是时候开始写测试代码了. Django支持python的单元测试(u ...