本文档基于TPC-H基准,测试PolarDB MySQL版8.0版本集群版的OLAP负载性能,您可以按照本文介绍自行测试对比,以快速了解数据库系统的性能。
注意事项
本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不符合TPC-H基准测试的所有要求。
测试环境
用于测试的ECS实例和PolarDB集群均位于同一地域、同一可用区。
网络类型均为VPC网络。
说明ECS实例和PolarDB集群需保证在同一个VPC中。
测试使用的PolarDB集群如下:
节点规格为polar.mysql.x8.4xlarge(32核256 GB)。
版本为MySQL 8.0.1和MySQL 8.0.2。
产品系列为集群独享版。
节点数量:2个(一个主节点、一个只读节点)。
并行查询测试使用的链接地址为主地址,如何查看PolarDB主地址请参见管理连接地址。
测试使用的ECS实例信息如下:
实例规格为ecs.c5.4xlarge。
实例挂载1000 GB高效云盘。
实例所使用的镜像为CentOS 7.0 64位。
测试工具
TPC-H是业界常用的一套基准,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group By聚合等。
安装TPC-H
本文档中的命令只能由root权限的用户来执行。
本文使用的TPC-H版本为TPC-H_Tools_v2.18.0,您需要先进行注册,注册完成后才能下载。
在ECS实例上安装TPC-H的操作步骤如下:
注册并下载TPC-H,并将下载的TPCH-H压缩包上传至ECS实例。上传文件的操作步骤请参见上传本地文件到ECS实例。
执行以下命令,解压缩上传的TPC-H压缩包。此处以压缩包
dbgen.zip
为例,执行命令时,请根据实际情况修改压缩包名称。unzip dbgen.zip
进入解压后的目录,此处以dbgen目录为例。执行命令时,请根据实际情况修改目录。
cd dbgen
执行以下命令,复制
makefile
文件。cp makefile.suite makefile
执行以下命令,安装GCC。
如果您安装的是centos系统,请执行以下命令安装GCC。
sudo yum install gcc
如果您安装的是ubuntu,请执行以下命令安装GCC。
sudo apt install gcc
修改
makefile
文件中的CC
、DATABASE
、MACHINE
、WORKLOAD
等参数定义。打开
makefile
文件。vim makefile
按
i
键,修改CC、DATABASE、MACHINE、WORKLOAD参数的值。################ ## CHANGE NAME OF ANSI COMPILER HERE ################ CC= gcc # Current values for DATABASE are: INFORMIX, DB2, ORACLE, # SQLSERVER, SYBASE, TDAT (Teradata) # 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
按Esc键,输入
:wq
保存并退出。
修改
tpcd.h
文件,并添加新的宏定义。打开
tpcd.h
文件。vim tpcd.h
按
i
键,添加如下宏定义。#ifdef MYSQL #define GEN_QUERY_PLAN "EXPLAIN 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
按Esc键,然后输入
:wq
保存并退出。
对文件进行编译。
make
编译完成后该目录下会生成两个可执行文件:
dbgen
:数据生成工具。在使用InfiniDB官方测试脚本进行测试时,需要用该工具生成tpch相关表数据。qgen
:SQL生成工具。生成初始化测试查询,由于不同的seed生成的查询不同,为了结果的可重复性,请使用附件提供的22个查询语句。
使用TPC-H生成测试数据。
./dbgen -s 100
参数
-s
的作用是指定生成测试数据的仓库数。使用TPC-H生成查询。
说明为了测试结果可重复,您可以忽略下面生成查询的步骤,使用附件的22个查询进行测试。
将
qgen
与dists.dss
复制到queries目录下。cp qgen queries cp dists.dss queries
使用以下脚本生成查询。
#!/usr/bin/bash for i in {1..22} do ./qgen -d $i -s 100 > db"$i".sql done
测试步骤
在ECS上连接PolarDB数据库,具体操作请参见连接数据库集群。
创建数据库。
create database tpch100g
创建表。
source ./dss.ddl
说明dss.ddl
在TPC-H中dbgen目录下。加载数据。
在ECS上创建
load.ddl
文件。Touch load.ddl
打开
load.ddl
文件。vim load.ddl
添加并保存如下脚本内容。
load data local INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'; load data local INFILE 'region.tbl' INTO TABLE region FIELDS TERMINATED BY '|'; load data local INFILE 'nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|'; load data local INFILE 'supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'; load data local INFILE 'part.tbl' INTO TABLE part FIELDS TERMINATED BY '|'; load data local INFILE 'partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'; load data local INFILE 'orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|'; load data local INFILE 'lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';
连接PolarDB数据库加载
load.ddl
文件数据。source ./load.ddl
创建主外键。
source ./dss.ri
以创建的数据库
tpch100g
为例,将TPC-H的dss.ri
文件中的内容替换并保存为如下内容。use TPCH100G; -- ALTER TABLE REGION DROP PRIMARY KEY; -- ALTER TABLE NATION DROP PRIMARY KEY; -- ALTER TABLE PART DROP PRIMARY KEY; -- ALTER TABLE SUPPLIER DROP PRIMARY KEY; -- ALTER TABLE PARTSUPP DROP PRIMARY KEY; -- ALTER TABLE ORDERS DROP PRIMARY KEY; -- ALTER TABLE LINEITEM DROP PRIMARY KEY; -- ALTER TABLE CUSTOMER DROP PRIMARY KEY; -- For table REGION ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY); -- For table NATION ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY); ALTER TABLE NATION ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references REGION(R_REGIONKEY); COMMIT WORK; -- For table PART ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY); COMMIT WORK; -- For table SUPPLIER ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY); ALTER TABLE SUPPLIER ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- For table PARTSUPP ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; -- For table CUSTOMER ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY); ALTER TABLE CUSTOMER ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- For table LINEITEM ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER); COMMIT WORK; -- For table ORDERS ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY); COMMIT WORK; -- For table PARTSUPP ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references SUPPLIER(S_SUPPKEY); COMMIT WORK; ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references PART(P_PARTKEY); COMMIT WORK; -- For table ORDERS ALTER TABLE ORDERS ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references CUSTOMER(C_CUSTKEY); COMMIT WORK; -- For table LINEITEM ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references ORDERS(O_ORDERKEY); COMMIT WORK; ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references PARTSUPP(PS_PARTKEY,PS_SUPPKEY); COMMIT WORK;
可选:创建索引。
#!/usr/bin/bash host=$1 port=$2 user=$3 password=$4 db=$5 sqls=("create index i_s_nationkey on supplier (s_nationkey);" "create index i_ps_partkey on partsupp (ps_partkey);" "create index i_ps_suppkey on partsupp (ps_suppkey);" "create index i_c_nationkey on customer (c_nationkey);" "create index i_o_custkey on orders (o_custkey);" "create index i_o_orderdate on orders (o_orderdate);" "create index i_l_orderkey on lineitem (l_orderkey);" "create index i_l_partkey on lineitem (l_partkey);" "create index i_l_suppkey on lineitem (l_suppkey);" "create index i_l_partkey_suppkey on lineitem (l_partkey, l_suppkey);" "create index i_l_shipdate on lineitem (l_shipdate);" "create index i_l_commitdate on lineitem (l_commitdate);" "create index i_l_receiptdate on lineitem (l_receiptdate);" "create index i_n_regionkey on nation (n_regionkey);" "analyze table supplier" "analyze table part" "analyze table partsupp" "analyze table customer" "analyze table orders" "analyze table lineitem" "analyze table nation" "analyze table region") for sql in "${sqls[@]}" do mysql -h$host -P$port -u$user -p$password -D$db -e "$sql" done
说明为了更有效地衡量并行查询带来的性能提升,您可以通过如下查询将使用到的索引数据预载到内存池中。
#!/bin/bash host=$1 port=$2 user=$3 password=$4 dbname=$5 MYSQL="mysql -h$host -P$port -u$user -p$password -D$dbname" if [ -z ${dbname} ]; then echo "dbname not defined." exit 1 fi table_indexes=( "supplier PRIMARY" "supplier i_s_nationkey" "part PRIMARY" "partsupp PRIMARY" "partsupp i_ps_partkey" "partsupp i_ps_suppkey" "customer PRIMARY" "customer i_c_nationkey" "orders PRIMARY" "orders i_o_custkey" "orders i_o_orderdate" "lineitem PRIMARY" "lineitem i_l_orderkey" "lineitem i_l_partkey" "lineitem i_l_suppkey" "lineitem i_l_partkey_suppkey" "lineitem i_l_shipdate" "lineitem i_l_commitdate" "lineitem i_l_receiptdate" "nation i_n_regionkey" "nation PRIMARY" "region PRIMARY" ) for table_index in "${table_indexes[@]}" do ti=($table_index) table=${ti[0]} index=${ti[1]} SQL="select count(*) from ${table} force index(${index})" echo "$MYSQL -e '$SQL'" $MYSQL -e "$SQL" done
运行查询。
#!/usr/bin/env bash host=$1 port=$2 user=$3 password=$4 database=$5 resfile=$6 echo "start test run at"`date "+%Y-%m-%d %H:%M:%S"`|tee -a ${resfile}.out for (( i=1; i<=22;i=i+1 )) do queryfile="Q"${i}".sql" start_time=`date "+%s.%N"` echo "run query ${i}"|tee -a ${resfile}.out mysql -h ${host} -P${port} -u${user} -p${password} $database -e" source $queryfile;" |tee -a ${resfile}.out end_time=`date "+%s.%N"` start_s=${start_time%.*} start_nanos=${start_time#*.} end_s=${end_time%.*} end_nanos=${end_time#*.} if [ "$end_nanos" -lt "$start_nanos" ];then end_s=$(( 10#$end_s -1 )) end_nanos=$(( 10#$end_nanos + 10 ** 9)) fi time=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))` echo ${queryfile} "the "${j}" run cost "${time}" second start at"`date -d @$start_time "+%Y-%m-%d %H:%M:%S"`" stop at"`date -d @$end_time "+%Y-%m-%d %H:%M:%S"` >> ${resfile}.time done
测试结果
并行查询性能测试请参见并行查询性能。