本文档基于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。
- 产品系列为集群独享版。
- 节点数量:
- 并行查询测试的节点数量为两个(一个主节点、一个只读节点)。
- IMCI性能测试的节点数量为三个(一个主节点、一个只读节点、一个只读列存节点)。
- 并行查询测试使用的链接地址为主地址,如何查看PolarDB主地址请参见申请集群地址和主地址。
- 测试使用的ECS实例信息如下:
- 实例规格为ecs.c5.4xlarge。
- 实例挂载1000 GB高效云盘。
- 实例所使用的镜像为CentOS 7.0 64位。
测试工具
TPC-H是业界常用的一套基准,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group By聚合等。
安装TPC-H
本文使用的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
- 如果您安装的是centos系统,请执行以下命令安装GCC。
- 修改
makefile
文件中的CC
、DATABASE
、MACHINE
、WORKLOAD
等参数定义。 - 修改
tpcd.h
文件,并添加新的宏定义。 - 对文件进行编译。
make
编译完成后该目录下会生成两个可执行文件:
dbgen
:数据生成工具。在使用InfiniDB官方测试脚本进行测试时,需要用该工具生成tpch相关表数据。qgen
:SQL生成工具。生成初始化测试查询,由于不同的seed生成的查询不同,为了结果的可重复性,请使用附件提供的22个查询语句。
- 使用TPC-H生成测试数据。
./dbgen -s 100
参数
-s
的作用是指定生成测试数据的仓库数。 - 使用TPC-H生成查询。说明 为了测试结果可重复,您可以忽略下面生成查询的步骤,使用附件的22个查询进行测试。
测试方法
- 在ECS上连接PolarDB数据库,具体操作请参见连接数据库集群。
- 创建数据库。
create database tpch100g
- 创建表。
source ./dss.ddl
说明dss.ddl
在TPC-H中dbgen目录下。 - 加载数据。
- 创建主外键。
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
- IMCI性能测试中,并未对TPC-H各个表建立二级索引,具体请参见列存索引(IMCI)性能。故该步骤不适用于IMCI性能测试场景。
- 为了更有效地衡量并行查询带来的性能提升,您可以通过如下查询将使用到的索引数据预载到内存池中。
- 运行查询。
#!/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
后续步骤
- 并行查询性能测试结果请参见并行查询性能。
- 列存索引(IMCI)性能测试结果请参见列存索引(IMCI)性能。