TPC-H数据导入MySQL教程(施工中)

事先说明:这篇教程还在施工中……到目前写完的步骤都是一定程度上实验过OK的,虽然没有实验关联primary key和foreign key的后果……(因为导入要花太长时间)

获取文件

首先到官网 http://www.tpc.org/tpch/ 在右边的 DBGEN & Reference Data Set 下载到下面那个.zip,然后自己选一个路径解压过去

修改 makefile

在解压的文件夹下面cd到dbgen下,找到makefile.suite,把103~112行左右改成这个样子

CC      = gcc
# Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata)
#                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
# Current values for MACHINE are:  ATT, DOS, HP, IBM, ICL, MVS, 
#                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
# Current values for WORKLOAD are:  TPCH
DATABASE = MYSQL
MACHINE = LINUX
WORKLOAD = TPCH
#

改动的地方分别是:

  • 设定C语言编译器为gcc(如果你用的是其他的编译器就改成其他对应名字)
  • DATABASE设为MYSQL(注意注释里写的提供的数据库格式没有mysql,所以等一下要自己写一个格式,见步骤3)
  • MACHINE = LINUX 和 WORKLOAD = TPCH 就不用说啥意思了……

改好之后保存为makefile,这样才好用make命令。

修改tpcd.h

// 其实这一步好像没什么用 = =
// 不过你上面把DATABASE设成了MYSQL的话就不要跳过这一步,不然编译不了。 
// 或者上面那步也可以设成SQLSERVER这步就不用管了

之前说了官方的生成程序没有mysql的格式,所以我们要自己写一个,打开tpcd.h,找一个空白的地方写上

#ifdef MYSQL
#define GEN_QUERY_PLAN  ""
#define START_TRAN      "START TRANSACTION"
#define END_TRAN        "COMMIT"
#define SET_OUTPUT      ""
#define SET_ROWCOUNT    "limit %d;\n"
#define SET_DBASE       "use %s;\n"
#endif

这样就定义了一个MYSQL的脚本格式可以用了。

生成dbgen

接下来make,生成数据生成脚本dbgen,这个过程中会有一些关于数据类型的警告,一般可以无视。

make完dbgen目录下之后就会多出很多.o(等到你所有事都干完确定这些没有用了不想留着就make clean,或者直接整个文件夹删掉……)和一个叫dbgen的文件

生成tbl数据文件

接下来要用dbgen生成数据,一共会生成8个表(.tbl)。

查看README里面有命令行参数解说,这里我们在dbgen目录下用

./dbgen -s 1

-s 1 表示生成1G的数据 (如果你之前曾经尝试过生成数据,最好先make clean,再重新make,接着到这步加上-f覆盖掉)

生成之后可以用head命令检查一下tbl们

修改初始化脚本使mySQL可用

压缩包里自带两个脚本:

  • dss.ddl:用来建表
  • dss.ri:关联表中primary key和foreign key。

不过不能直接在mySQL里用(看README就知道人家根本没考虑过mySQL……),要修改。

在dss.ddl的开头加上这么几句:

DROP DATABASE IF EXISTS tpch;
CREATE DATABASE tpch;
USE tpch;

翻译成人话就是:

如果tpch数据库已经存在,删除这个数据库;
建一个数据库tpch;
使用数据库tpch;

这个是给mySQL建立数据库连接用的。其中tpch可以改成你喜欢的随便什么名字。

改完之后保存之。

dss.ri的修改先挖个坑……如果你不想关联primary key和foreign key的话就不用管dss.ri了

以下可选,但本教程后面的步骤没有考虑这步

鉴于tpch自带的测试用的表名是小写的,而dss.ddl里面的表名是大写的,我们最好也改成小写……

用vim打开dss.ddl,执行

:%s/TABLE\(.*\)/TABLE\L\1

就可以了。

如果你要事后改,就进到mySQL里,USE tpch,然后用类似于

alter table CUSTOMER rename to customer;

这样的语句改就行了。嫌一个个打麻烦的话就写脚本吧~

 

建表

打开mysql,执行

mysql> \. ~/tpch_2_16_1/dbgen/dss.ddl

后面那部分是dss.ddl的路径,要按照你的实际存放地址修改

然后可以用

mysql> SHOW DATABASES;

看到有一个叫tpch的数据库,就说明建库成功了。(记得打分号,我老是忘记打分号……)

再执行

mysql> USE tpch;
mysql> SHOW TABLES;

可以看到生成的8个表就说明建表成功~ 到这步的时候光有一堆表,里面是没有数据的。

写个导入tbl文件的脚本

你也可以进到mysql然后写一堆类似于

LOAD DATA LOCAL INFILE ‘/home/joyeecheung/tpch_2_16_1/dbgen/supplier.tbl‘ INTO TABLE SUPPLIER
FIELDS TERMINATED BY ‘|‘ LINES TERMINATED BY ‘|\n‘;

的东西,不过实在太龟毛了……所以还是写一个bash脚本自动生成这些语句好了。

不懂bash的人可以看下面,懂的大牛看了这么弱的脚本请别来pia我……

dbgen目录下新建一个load.sh(或者随便什么名字),把这些东西复制进去

#!/bin/bash

write_to_file()
{

    file="loaddata.sql"

    if [ ! -f "$file" ] ; then
        touch "$file"
    fi

    echo ‘USE tpch;\n‘ >> $file
    DIR=`pwd`
    for tbl in `ls *.tbl`; do
        table=$(echo "${tbl%.*}" | tr ‘[:lower:]‘ ‘[:upper:]‘)
        echo "LOAD DATA LOCAL INFILE ‘$DIR/$tbl‘ INTO TABLE $table" >> $file
        echo "FIELDS TERMINATED BY ‘|‘ LINES TERMINATED BY ‘|\\\n‘;\n" >> $file
    done
 }

write_to_file

以load.sh为名保存到dbgen目录下,然后执行

sh load.sh

同目录下就会生成一个loaddata.sql,里面是从8个tbl里导入数据的sql指令。

执行脚本导入数据

在dbgen目录下运行

mysql --local-infile -u root -p < loaddata.sql

记得要加那个 --local-infile。然后喝茶等导入……

如果你觉得它好像死在那里了,可以再开一个终端,登陆MySQL,用show processlist;看看它在干嘛。

测试

按照前面的步骤,如果你不加foreign key和primary key关联的话,导入还是挺快的……

我的本本CPU是i7-2670QM@2.20GHz,虚拟机分配了2个核和2G内存,日立的硬盘分了20G给它(现在一看貌似不够用啊囧),大概7分钟左右就能导入完的样子,用time来计时的结果是:

real    7m44.092s
user    0m0.136s
sys    0m11.029s

real还那边包括了我输密码io的时间。

导入完了之后可以用

SHOW TABLE STATUS FROM tpch;

看看是不是都导入进去了,我测试是都导进去了。

剩余部分挖坑中……

TPC-H数据导入MySQL教程(施工中),布布扣,bubuko.com

TPC-H数据导入MySQL教程(施工中)

上一篇:MySQL Connector/Net 的简单使用


下一篇:客户端—表单验证信息—并能否提交到数据库