MySQL 如何准备一亿条记录的表来测试

曾经一个朋友问我如何快速的在线往一个大表里面添加一个字段或者修改一个字段的长度,mysql版本是5.6,所以就准备在测试环境准备一个一亿条记录的表,然后来实际测试下到底哪种方式比较快,先来开始准备一亿条记录的表。

 

我线上有上亿条记录的表,但是很多网上朋友都没有,那么我这里就实践了一条办法,来实现自己构造一亿条数据记录的表。实现思路就是先建一张通用的20个字段左右的用户表,然后写一个存储过程,不停的往这个表里面写数据,while循环写上一亿次,这样就形成了一张一亿条记录的表出来。

 

 

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、准备录入数据的存储过程

存储过程内容:


DELIMITER $$

USE `test`$$

DROP PROCEDURE IF EXISTS test.`pro_test_data`$$

CREATE PROCEDURE test.`pro_test_data`( pos_begin INT,pos_end INT)

BEGIN

DECLARE i INT;

SET i=pos_begin;

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

INSERT INTO test.`UC_USER` (`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;

END WHILE;

END$$

DELIMITER ;

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

在sql命令窗口界面执行过程如下:


mysql> DELIMITER $$

mysql> USE `test`$$

Database changed

mysql> DROP PROCEDURE IF EXISTS test.`pro_test_data`$$

Query OK, 0 rows affected (0.00 sec)

mysql> CREATE PROCEDURE test.`pro_test_data`( pos_begin INT,pos_end INT)

-> BEGIN

-> DECLARE i INT;

-> SET i=pos_begin;

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

->

Display all 1421 possibilities? (y or n)

-> INSERT INTO test.`UC_USER` (`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‘);

->

->

Display all 1421 possibilities? (y or n)

-> SET i=i + 1;

-> END WHILE;

-> END$$

Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql>

3、开始录入数据

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


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

Query OK, 1 row affected (2 hours 26 min 56.32 sec)  # 看到用时是2 hours 26 min 56.32 sec,2个半小时。

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

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

| count(1)  |

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

| 100000001 |

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

1 row in set (3 min 0.14 sec)

mysql>

4、清除binlog日志

因为录入了一亿条记录,所以会产生大量的binlog日志,我们需要清除这些binlog记录,免得占据磁盘空间:


mysql> show master status;

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

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                      | Executed_Gtid_Set |

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

| mysql-bin.007143 |  4589266 |              | information_schema,performance_schema |                   |

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

1 row in set (0.01 sec)

mysql> purge master logs to "mysql-bin.0007143";

ERROR 1373 (HY000): Target log not found in binlog index

mysql> purge master logs to "mysql-bin.007143";

Query OK, 0 rows affected (5.44 sec)

mysql>

时间: 2024-10-18 00:44:15

MySQL 如何准备一亿条记录的表来测试的相关文章

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

  在上一次朋友问我如何快速构造一亿条记录的表后,我理出了实行的办法,见:http://blog.csdn.net/mchdba/article/details/52938114,但是因为录入一亿表需要2个小时,所以还是感觉速度慢了些,那有没有啥办法能加快这一步骤呢?   1.建一张通用的用户表 建用户表没有啥变化,还是和上次一样. USE test; CREATE TABLE `UC_USER` ( `ID` BIGINT (20), `USER_NAME` VARCHAR (400), `U

Mysql 高效随机生成N条记录

1 select *, rand() as random FROM yef_exercises where id not in(1) order by random limit 1 // Mysql Mysql 高效随机生成N条记录,布布扣,bubuko.com

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

这里提供一种方法,使用 APPEND 提示,使得十分钟内插入上亿数据成为可能. -- Create table create table TMP_TEST_CHAS_LEE ( f01 VARCHAR2(20), f02 NUMBER(10) not null, f03 VARCHAR2(21), f04 VARCHAR2(21), f05 NUMBER, f06 NUMBER(20) ); --创建一个临时表,用于提供序列号 CREATE GLOBAL TEMPORARY table t_se

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

做测试的时候遇到一个情况"AX 插入一条记录提示表记录已经存在,但是该记录实际上是不存在的." 检查到该表(TABLE_ABC)所有的key都是AllowDuplicate的, 继续检查表属性发现 createdRecIdxIdx设置为Yes, 启用了RecId作为唯一键. 因此推测 应该是该表的recid 的nextvalue 数据不对了. 想办法刷新 recid . 在sql 后台 1. 计算 Table_ABC目前最大的RecId declare @maxRecId int64

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

读写文件 背景及木:现有数据1000w单表,为压力测试准备1亿条数据. 步骤: 1.将1000w条记录,除id外都导入到多个文件中: //DELIMITER DROP PROCEDURE if EXISTS createManyTable; create PROCEDURE createManyTable() BEGIN DECLARE i int; DECLARE fileName VARCHAR(30); set i=1; while i<251 DO SET fileName=CONCAT

Mysql取分组中前N条记录

表结构如下:CREATE TABLE `dwb_rmirror_req_d` ( `thedate` varchar(10) NOT NULL DEFAULT '', `node` varchar(15) NOT NULL DEFAULT '', `req_num` bigint(20) DEFAULT NULL, PRIMARY KEY (`thedate`,`node`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 表中的记录如下:mysql> select *

面试题之十亿条记录,怎么获取出现最多的前十个

宅在家中无事,刷面试题,发现了一个很有意思的面试题. 就来琢磨一下这个是如何能够处理成功.(这是一个长更新视频,说不定中间就干其他的去了,慢慢更ing) StratTime : 202002191600 首先我们来造一下数据.虽然不知道淘宝的购物记录,但是我们来算成ip浏览记录吧.那么我们来获取10亿条ip 代码如下 public class createIp { public static String getRandomIp() { // ip范围 int[][] range = { { 6

mysql查询表中最后一条记录

查询全部的记录:            select * from test_limit ; 查第一条记录:             select * from test_limit limit 1; 查前面两条记录:         select * from test_limit limit 0,2; 查第二和第三条记录:     select * from test_limit limit 1,2; 查最后一条记录:          select * from test_limit or

Mysql慢查询开启和查看 ,存储过程批量插入1000万条记录进行慢查询测试

首先登陆进入Mysql命令行  执行sql      show variables like 'slow_query%';  结果为OFF 说明还未开启慢查询 执行sql     show variables like 'long_query_time';  可以看到具体的慢查询 ""时限" 我们先开启慢查询 执行sql set global slow_query_log='ON'; 这是再去查询一下(show variables like 'slow_query%';)发现