列存索引测试方法

本文档基于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个查询语句。

测试步骤

  1. 在ECS上连接PolarDB数据库。具体操作请参见连接数据库集群

  2. 创建数据库并导入数据。

    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>

    导入数据的数据库。

  3. 对所有使用的表执行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;
  4. 执行以下查询语句。

    #!/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)性能