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(‘f_log_‘,i,‘.txt‘);

SET @STMT :=CONCAT("select `xx`,`xx`,`xx`,`xx`,.... into outfile ‘temp/",fileName,
"‘ lines terminated by ‘\r\n‘ from `f_log` WHERE id>= ",40000*(i-1)," AND id< ",40000*i);

PREPARE STMT FROM @STMT;
EXECUTE STMT;

set i=i+1;
end while;
END;
//DELIMITER
CALL createManyTable();

2. 将上述多个文件合并到同一个文件,并且在第一列加入id列:

    public static void main(String[] args) throws IOException {
        int i=10000000;
        int step=40000;
        File out=new File("E:/data/f_log_data.txt");
        for(int k=1;k<251;k++){
            File file=new File("E:/data/temp/f_log_"+k+".txt");
            StringBuffer sb=new StringBuffer();
            if(file.exists()){
                sb=readFile(file,i+step*k);
                writeFile(out,sb);
            }
        }

    }

    public static StringBuffer readFile(File file,int start) throws IOException{
        StringBuffer sb=new StringBuffer();
        BufferedReader reader=new BufferedReader(new FileReader(file));
        String line="";    

        while(line != null){
            line = reader.readLine();
            if(line == null){
                break;
            }
            if(line.trim().equalsIgnoreCase("")){
                continue;
            }
            start++;
            sb.append(start+"\t"+line.trim()+"\r\n");
        }
        reader.close();
        return sb;
    }

    public static void writeFile(File file,StringBuffer sb) throws IOException{
        BufferedWriter writer = new BufferedWriter(new FileWriter(file, true));
        writer.write(sb.toString());
        writer.close();
    }

    public void writeFile11() throws IOException{

        // TODO Auto-generated method stub
        BufferedWriter writer = new BufferedWriter(new FileWriter(new File("D:/driver/data.txt"), true));
        for(int i=0;i<1000000;i++){
            if(i%10==0){
                writer.write("赵"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }if(i%10==1){
                writer.write("钱"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }
            if(i%10==2){
                writer.write("孙"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }if(i%10==3){
                writer.write("李"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }
            if(i%10==4){
                writer.write("郑"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }if(i%10==5){
                writer.write("吴"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }
            if(i%10==6){
                writer.write("周"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }if(i%10==7){
                writer.write("王"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }
            if(i%10==8){
                writer.write("张"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }if(i%10==9){
                writer.write("刘"+(i/10)+"\t"+ (int)(Math.random()*100)+"\n");
            }
        }
        writer.close();

    }

3. 将合并后的文件导入到数据表中:

load data local infile ‘/tmp/finance_log_data.txt‘ into table f_log(`id`,`xx`,
`xx`,.........................
);

注意事项:开始考虑使用存储过程来逐步导入到数据表中,但load data命令不能在存储过程中使用。

  另外,数据的合并也可以以shell脚本完成,但习惯使用java了,因此以java来完成,显得比较复杂。不过,可以随便复习一下java的读写文件,有算不错的经历。

Q&A

时间问题:生成1亿条数据(在有索引的情况下),用时3个小时。如果使用insert语句,估计会疯掉!

时间: 2024-07-31 20:23:22

mysql 造1亿条记录的单表--大数据表的相关文章

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 如何准备一亿条记录的表来测试

曾经一个朋友问我如何快速的在线往一个大表里面添加一个字段或者修改一个字段的长度,mysql版本是5.6,所以就准备在测试环境准备一个一亿条记录的表,然后来实际测试下到底哪种方式比较快,先来开始准备一亿条记录的表.   我线上有上亿条记录的表,但是很多网上朋友都没有,那么我这里就实践了一条办法,来实现自己构造一亿条数据记录的表.实现思路就是先建一张通用的20个字段左右的用户表,然后写一个存储过程,不停的往这个表里面写数据,while循环写上一亿次,这样就形成了一张一亿条记录的表出来.     1.

php实现只保留mysql中最新1000条记录

这篇文章主要介绍了php实现只保留mysql中最新1000条记录的方法和相关示例及数据库结构,十分的全面,有需要的小伙伴可以参考下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <?php mysql_connect("localhost","root","root"); mysql_select_db("test"); //保留最新的1000条记录 $

如何在十分钟内插入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

Python Flask 向MySQL表里插入一条记录,提示Unknown column &#39;XXX&#39; in &#39;field list

sql =' INSERT INTO `blog`.`user` (`id`, `username`) VALUES (%d, %s)' %(1,username) 我在给username赋值aaabbb后提示:"Unknown column 'aaaabbb' in 'field list'" 找了半天问题,原来是%s没加双引号. 改为如下 sql =' INSERT INTO `blog`.`user` (`id`, `username`) VALUES (%d, "%s

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

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

关于Oracle,sqlserver,mysql中查询10-20条记录的写法

一: oracle数据库写法: 1:select * from (select rownum rn ,* from 表名 where?rownum<20?) a? ?where a.rn>10 2:select * from 表名 where rownum<20 minus select * from 表名 where rownum<10 ? 二:SqlServer数据库写法: 1:select top 20 * from tablename where id not?exists

[mysql] 查询前几条记录

From: http://www.cnblogs.com/xuxm2007/archive/2010/11/16/1878211.html SELECT   *   FROM   table   LIMIT   5;           select     *     from     issu_info     limit     0,6             Limit     0,6       这里是对的,显示前6条                   select     *   

mysql怎么查询一条记录的前一条记录和后一条记录

上一条:select * from 表 where 数据id<@当前显示数据id order by 数据_id asc) limit 1下一条:select * from 表 where 数据id>@当前显示数据id order by 数据_id desc) limit 1 mysql 里面不支持 select top