本文档基于TPC-H基准来测试列存索引的性能,您可以按照本文内容自行测试对比,以快速了解和使用列存索引功能。
注意事项
本文的TPC-H的实现基于TPC-H的基准测试,并不能与已发布的TPC-H基准测试结果相比较,本文中的测试并不符合TPC-H基准测试的所有要求。
测试环境
用于测试的ECS实例和PolarDB集群均位于同一地域、同一可用区。
网络类型均为VPC网络。
说明ECS实例和PolarDB集群需保证在同一个VPC中。
测试使用的PolarDB集群如下:
节点规格为polar.mysql.x8.4xlarge(32核256 GB独享规格)和polar.mysql.x4.xlarge(8核32 GB独享规格)两种。
版本为MySQL 8.0.1和MySQL 8.0.2。
产品系列为集群独享版。
节点数量:3~6个(一个主节点、一个只读节点、1~4个只读列存节点)。
测试使用的ECS实例信息如下:
实例规格为ecs.c5.4xlarge。
按需实例挂载200 GB/2000 GB/4000 GB云盘(分别用于测试100 GB、1 TB和3 TB测试环境下的性能)。
实例所使用的镜像为CentOS 7.0 64位。
测试工具
TPC-H是业界常用的一套基准,由TPC委员会制定发布,用于评测数据库的分析型查询能力。TPC-H查询包含8张数据表、22条复杂的SQL查询,大多数查询包含若干表Join、子查询和Group By聚合等。
安装TPC-H工具
git clone https://github.com/yubinr/benchtpch.git
cd benchtpch/dbgen-src
make
命令执行完成后,benchtpch/dbgen-src
目录下会生成两个可执行文件:
dbgen:数据生成工具。使用InfiniDB官方测试脚本进行测试时,需要使用该工具生成tpch相关的表数据。
qgen:SQL生成工具。生成初始化测试查询语句,由于不同的seed生成的查询语句不同,为了结果的可重复性,请使用附件提供的22个查询语句。
测试步骤
在ECS上连接PolarDB数据库。具体操作请参见连接数据库集群。
创建数据库并导入数据。
cd benchtpch/tpch # 执行data_kit.sh,以tpch100g为例(mysql使用/usr/bin/mysql) sh ./data_kit.sh -g /root/benchtpch/dbgen-src/ -c <CHUNKS> -d <DATADIR> -s <SCALE_FACTOR> -b /usr/ -H <HOST> -P <PORT> -u <NAME> -p <PASSWORD> --database <DATABASE> --ddl columnar_p.ddl --parallel 40
命令行中的参数说明如下:
参数名称
参数说明
<CHUNKS>
生成数据的划分块数。如果导入100 GB的数据,建议将划分块数设置为400。
<DATADIR>
生成的tpch的数据目录。
<SCALE_FACTOR>
dbgen的规格。
<HOST>
PolarDB集群的主地址。
<PORT>
端口号。
<NAME>
数据库账号。
<PASSWORD>
数据库账号对应的密码。
<DATABASE>
导入数据的数据库。
对所有使用的表执行
ANALYZE TABLE
操作以获取更精确的统计信息。ANALYZE TABLE supplier; ANALYZE TABLE part; ANALYZE TABLE partsupp; ANALYZE TABLE customer; ANALYZE TABLE orders; ANALYZE TABLE lineitem; ANALYZE TABLE nation; ANALYZE TABLE region;
执行以下查询语句。
#!/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" # pre run mysql -h ${host} -P${port} -u${user} -p${password} $database -e" source $queryfile;" > /dev/null 2>&1 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)性能。