TiDB企业版(平凯数据库)敏捷模式性能测试
1.测试目标
对平凯数据库(PingCAP TiDB)与MySQL数据库进行对比测试,重点评估两款数据库在企业级应用场景下的综合表现。测试涵盖OLTP/OLAP性能、数据压缩比、易用性、可扩展性和可靠性等关键指标。
2.测试范围
- 数据库版本:TiDB企业版(平凯数据库) v7.1.8-5.2 vs MySQL 8.0.41
- 测试数据量:约50GB
- 测试模型:Sysbench OLTP、TPC-H OLAP、Sysbench测试数据压缩比
3. 测试环境配置
3.1 硬件环境
组件 | 配置规格 |
---|---|
CPU | Intel Xeon E5-2640V4 2.4GHz (2颗) |
内存 | 96GB |
存储 | SAS 1TB (10K) |
网络 | 1Gb |
3.2 软件环境
项目 | TEM(v3.1.0) | TiDB集群 | MySQL |
---|---|---|---|
虚拟机 | VMworkstation 16 | VMworkstation 16 | VMworkstation 16 |
虚拟CPU | 2颗2核(4C) | 2颗2核(4C) | 2颗2核(4C) |
虚拟内存 | 16GB | 16GB | 16GB |
虚拟硬盘 | 200GB | 200GB | 200GB |
操作系统 | Rocky Linux 8.9 | Rocky Linux 8.9 | Rocky Linux 8.9 |
TiDB版本 | v7.1.8-5.2 | - | |
MySQL版本 | - | v8.0.41 | |
集群配置 | 1 PingkaiDB Fusion、1 TiFlash 1 Prometheus、1 Grafana、1 AlertManager | 单机(InnoDB存储引擎) | |
IP地址 | 192.168.18.180 | 192.168.18.181 | 192.168.18.182 |
- 说明:TEM、TiDB集群(伪集群,所有组件均部署在同一节点上) 、MySQL均为 单节点。
4. 环境部署
4.1 TEM部署
(1)下载TEM安装包,并将安装包上传至服务器192.168.18.180
(2)解压安装包
tar xvf tem-amd64.tar.gz
cd tem-package-v3.0.0-linux-amd64
(3)修改元数据库文件
# 修改文件名,TEM安装包解压后的文件为metadb_topology_template.yaml
mv metadb_topology_template.yaml metadb_topology.yaml
# 修改配置文件中的IP,更换为TEM主机的IP
vi metadb_topology.yaml
pd_servers:
- host: 192.168.18.180 # 更换成部署 TEM 的主机 IP
tidb_servers:
- host: 192.168.18.180 # 同上
port: 4000
tikv_servers:
- host: 192.168.18.180 # 同上
(4)修改TEM配置文件
# 修改安装包中默认的配置文件config.yaml
vi config.yaml
server_configs: # 这⾥指定 tem 节点的全局配置
tem_servers:
db_addresses: "192.168.18.180:4000" # 填写上面metadb配置文件中的IP
db_u: "root" # 若由 tem 辅助创建的元数据库,请使⽤ root ⽤户
db_pwd: "" # 若由 tem 辅助创建的元数据库,请使⽤空密码
db_name: "test" # 若由 tem 辅助创建的元数据库,请使⽤ test 数据库
log_filename: "/tem-deploy/tem-server-8080/log/tem.log"
log_tem_level: "info"
log_max_size: 300
log_max_days: 0
log_max_backups: 0
external_tls_cert: "" # tem 对外使用的tls证书
external_tls_key: "" # tem 对外使用的tls密钥
internal_tls_ca_cert: "" # tem 内部节点间双向验证使用的tls证书
internal_tls_cert: "" # tem 内部节点间双向验证使用的tls证书
internal_tls_key: "" # tem 内部节点间双向验证使用的tls证书
tem_servers:
- host: "192.168.18.180" # 请填写 tem 节点的实际地址
port: 8080
mirror_repo: true # 是否开启镜像仓库,多个TEM节点时,有且仅有一个节点开启
(5)开始安装
# 开始安装
./install.sh
- 执行脚本后,约1分钟即可完成TEM安装
- 访问TEM
# 访问TEM,http://<TEM 部署ip地址>:<port>/login
http://192.168.18.180:8080
# TEM 默认⽤户名为 admin, 默认密码为 admin
4.2 用TEM部署TiDB集群(平凯数据库敏捷模式)
4.2.1 添加组件
TEM设置--组件管理--添加组件,上传平凯数据库敏捷模式安装包。
tidb-ee-server-v7.1.8-5.2-20250630-linux-arm64.tar.gz
tidb服务整合包tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-arm64.tar.gz
相关工具整合包
4.2.2 添加凭证
TEM设置--凭证--添加凭证,输入拟部署TiDB集群的服务器(192.168.18.181)root用户和密码。
4.2.3 配置中控机
TEM主机--集群管理中控机--添加中控机。
- IP 地址:192.168.18.181
- 名称:自定义
- SSH 端口:中控机 SSH 端口,默认 22
- 服务端口:中控机被控后提供服务的端口,默认 9090
- 凭证:上一个步骤中添加的 SSH 登录凭证
- 服务根目录:中控机被控后提供服务进程的安装目录,可设为
/root/tidb-cm-service
- 是否自动安装 TiUP:建议安装
- TiUP 镜像仓库:指定TEM使用的组件来源,仓库类型选TEM镜像仓库,在“设置 -> 组件管理 -> 设置仓库地址”可以拿到仓库地址
4.2.4 配置集群主机
TEM主机--主机--添加共享主机,此时添加的主机为部署TiDB集群的主机。
- 测试环境中,中控机和TiDB集群为同一台主机
4.2.5 创建集群
TEM集群--创建集群。
- 设置集群名称
- 选择集群中控机
- 选择集群版本:平凯v7.1.8-5.2,敏捷模式
- 选择部署模式:共享,并设置主机规格
- 选择要安装的组件:PingKaiDB-1个、TiFlash-1个、Prometheus-1个、Grafana-1个、AlertManager-1个
- 选择默认的集群配置参数,并开始创建集群
- 约10分钟,集群创建完成
4.2.6 优化集群参数
通过TEM登录tidb集群,在SQL编辑器,输入并执行SQL语句。
# 调整集群参数
set global tidb_runtime_filter_mode=LOCAL;
set global tidb_opt_enable_mpp_shared_cte_execution=on;
set global tidb_rc_read_check_ts=on;
set global tidb_analyze_skip_column_types="json,blob,mediumblob,longblob,mediumtext,longtext";
set global tidb_enable_collect_execution_info=off;
set global tidb_enable_instance_plan_cache=on;
set global tidb_instance_plan_cache_max_size=2GiB;
set global tidbx_enable_tikv_local_call=on;
set global tidbx_enable_pd_local_call=on;
set global tidb_schema_cache_size=0;
-- 是否持久化到集群:否,仅作用于当前连接的 TiDB 实例
set global tidb_enable_slow_log=off;
4.3 MySQL部署
(1)安装MySQL、设定用户
# 添加MySQL仓库
dnf install https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
dnf module disable mysql # 禁用默认模块
# 安装指定版本MySQL
dnf install mysql-community-server-8.0.41-1.el8
# 启动MySQL
systemctl start mysqld # 启动MySQL
systemctl enable mysqld # 设置开机启动
systemctl status mysqld # 检查状态
# 登录MySQL
mysql -u root -p #第一次登录时会要求设置密码
# 如没有,可在日志中查找临时密码
grep 'temporary password' /var/log/mysqld.log
# 修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
# 设置远程登录
CREATE USER 'root'@'%' IDENTIFIED BY '密码';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
(2)优化MySQL参数
# 在/etc/my.cnf.d/mysql-server.cnf配置文件中增加如下参数
[mysqld]
innodb_buffer_pool_size = 12G
innodb_flush_log_at_trx_commit = 0
sync_binlog = 0
local-infile = 1 # 支持本地文件导入
# innodb_buffer_pool_size = 64G # 建议设为物理内存的70-80%
5. 安装性能测试工具
5.1 安装Sysbench工具
# 安装依赖包
dnf install -y make automake libtool pkgconfig libaio-devel openssl-devel git
# 下载tar.gz安装包
git clone https://github.com/akopytov/sysbench.git
tar xvf sysbench-1.0.20.tar.gx
cd sysbench-1.0.20
./autogen.sh
./configure # 默认支持MySQL
make
make install
# 确认是否安装成功
sysbench --version
5.2 安装TPC-H工具
# 下载并上传TPC-H安装包
下载地址:https://www.tpc.org/tpch/
# 安装依赖包
yum install -y gcc make unzip
# 安装、配置TPC-H
unzip TPC-H-Tool.zip
mv 'TPC-H V3.0.1' tpc-h
cd tpc-h/dbgen
cp makefile.suite makefile
# 修改makefile配置参数
vi makefile
CC = gcc
DATABASE = MYSQL # 或INFORMIX(兼容模式)
MACHINE = LINUX
WORKLOAD = TPCH
# 修改config.h文件,在文件开头添加如下内容
vi config.h
----支持64位
#ifndef DSS_HUGE
#define DSS_HUGE long long
#endif
#ifndef HUGE_FORMAT
#define HUGE_FORMAT "%lld"
#endif
#define SUPPORT_64BIT 1
#ifndef RNG_A
#define RNG_A 1103515245LL
#endif
#ifndef RNG_C
#define RNG_C 12345LL
#endif
#ifndef SET_ROWCOUNT
#define SET_ROWCOUNT "LIMIT %d" // MySQL用LIMIT限制行数
#endif
----和mysql数据库相关
#ifndef START_TRAN
#define START_TRAN "START TRANSACTION"
#endif
#ifndef END_TRAN
#define END_TRAN "COMMIT"
#endif
#ifndef SET_DBASE
#define SET_DBASE "USE %s"
#endif
#ifndef SET_OUTPUT
#define SET_OUTPUT "SELECT INTO OUTFILE"
#endif
#ifndef GEN_QUERY_PLAN
#define GEN_QUERY_PLAN "EXPLAIN"
#endif
-----行数
#ifndef SET_ROWCOUNT
#define SET_ROWCOUNT "LIMIT %d"
#endif
-----日期
#ifndef HUGE_DATE_FORMAT
#define HUGE_DATE_FORMAT "%02lld"
#endif
# 编译
make
- 将此工具安装在MySQL服务器(192.168.18.182),通过其MySQL客户端,可以远程登录TiDB服务器,进行相关操作
- 编译完成后,即可使用dbgen生成测试数据
6. 性能测试
6.1 OLTP性能测试
6.1.1 MySQL性能测试
(1)生成测试数据
测试数据量可以根据大家的机器配置自行修改,建议测试数据量为 50 GB-1 TB
# 创建test数据库
mysql -u root -p
create database test;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=Root#1234 \
--mysql-db=test \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
prepare
# --tables=5 #生成5张表
# --table-size=25000000 #单表2500万行数据
# 数据约52G,执行时间约40分钟
(2)执行测试
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=root \
--mysql-password=Root#1234 \
--mysql-db=test \
--tables=5 \
--table-size=25000000 \
--threads=128 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > mysql-result.log
# --threads=128 \ # 根据需求调整线程数
# --time=600 \ # 测试时长(秒)
# --report-interval=10 \ # 每10秒报告一次
# mysql-result.log 生成执行结果的日志
(3)查看测试结果
# 查看执行结果
more mysql-result.log | grep "transactions:"
more mysql-result.log | grep "avg:"
more mysql-result.log | grep "95th percentile:"
# grep "transactions:" # TPS
# grep "avg:" # 平均延迟
# grep "95th percentile:" # P95延迟
6.1.2 TiDB性能测试
(1)生成测试数据
# 创建远程登录账号
create user 'tidb'@'%' IDENTIFIED WITH mysql_native_password BY 'Root#1234';
grant all privileges on *.* to 'tidb'@'%';
flush privileges;
# 远程登录TiDB数据库
mysql -h 192.168.18.181 -u tidb -P 4000 -p
# 创建数据库
create database titest;
# 生成测试数据
sysbench oltp_read_write \
--mysql-host=192.168.18.181 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=Root#1234 \
--mysql-db=titest \
--tables=5 \
--table-size=25000000 \
--db-driver=mysql \
--mysql-ignore-errors=all \
--create_secondary=off \
--auto-inc=on \
prepare
(2)执行测试
sysbench oltp_read_write \
--mysql-host=192.168.18.181 \
--mysql-port=4000 \
--mysql-user=tidb \
--mysql-password=Root#1234 \
--mysql-db=titest \
--tables=5 \
--table-size=25000000 \
--threads=128 \
--time=600 \
--report-interval=10 \
--db-driver=mysql \
run > tidb-result.log
(3)查看测试结果
# 查看执行结果
more tidb-result.log | grep "transactions:"
more tidb-result.log | grep "avg:"
more tidb-result.log | grep "95th percentile:"
6.2 OLAP性能测试
6.2.1 MySQL性能测试
(1)生成测试数据
# 通过TPC-H生成测试数据
./dbgen -s 10 -f
# 会自动生成8个.tbl文件(lineitem, orders, part等)
# -s 10 表示生成约10GB原始文本数据
# 检查生成的tbl文件
ls -lh *.tbl
(2)将tbl数据导入数据库
1)在MySQL中创建数据库和表
# 创建数据库
mysql -u root -p
create database tpch;
# 修改TPC工具中的dss.ddl文件
vi /root/tpc-h/dbgen/dss.ddl
# 在文件开头,加入如下语句
drop database tpch;
create database tpch;
use tpch;
# 在mysql中建表
mysql -u root -p
# 在mysql命令行,执行如下命令,即可创建8张表
\. /root/tpc-h/dbgen/dss.ddl
2)创建数据导入文件load.ddl
# 在tpc-h工具的安装目录
vi load.ddl
use tpch
load data local INFILE '/data/tbl/customer.tbl' INTO TABLE CUSTOMER FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/region.tbl' INTO TABLE REGION FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/nation.tbl' INTO TABLE NATION FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/supplier.tbl' INTO TABLE SUPPLIER FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/part.tbl' INTO TABLE PART FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/partsupp.tbl' INTO TABLE PARTSUPP FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/orders.tbl' INTO TABLE ORDERS FIELDS TERMINATED BY '|';
load data local INFILE '/data/tbl/lineitem.tbl' INTO TABLE LINEITEM FIELDS TERMINATED BY '|';
3)导入数据
# 导入数据
mysql -u root -p
\. /root/tpc-h/dbgen/load.ddl
# 也可以执行下面的语句
source /root/tpc-h/dbgen/load.ddl
4)创建索引
# 修改dss.ri文件
-- Sccsid: @(#)dss.ri 2.1.8.1
-- tpch Benchmark Version 8.0
-- CONNECT TO tpch;
use tpch;
-- ALTER TABLE tpch.REGION DROP PRIMARY KEY;
-- ALTER TABLE tpch.NATION DROP PRIMARY KEY;
-- ALTER TABLE tpch.PART DROP PRIMARY KEY;
-- ALTER TABLE tpch.SUPPLIER DROP PRIMARY KEY;
-- ALTER TABLE tpch.PARTSUPP DROP PRIMARY KEY;
-- ALTER TABLE tpch.ORDERS DROP PRIMARY KEY;
-- ALTER TABLE tpch.LINEITEM DROP PRIMARY KEY;
-- ALTER TABLE tpch.CUSTOMER DROP PRIMARY KEY;
-- For table REGION
ALTER TABLE tpch.REGION
ADD PRIMARY KEY (R_REGIONKEY);
-- For table NATION
ALTER TABLE tpch.NATION
ADD PRIMARY KEY (N_NATIONKEY);
ALTER TABLE tpch.NATION
-- ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION;
ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION(R_REGIONKEY);
COMMIT WORK;
-- For table PART
ALTER TABLE tpch.PART
ADD PRIMARY KEY (P_PARTKEY);
COMMIT WORK;
-- For table SUPPLIER
ALTER TABLE tpch.SUPPLIER
ADD PRIMARY KEY (S_SUPPKEY);
ALTER TABLE tpch.SUPPLIER
ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.NATION(N_NATIONKEY);
COMMIT WORK;
-- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
COMMIT WORK;
-- For table CUSTOMER
ALTER TABLE tpch.CUSTOMER
ADD PRIMARY KEY (C_CUSTKEY);
ALTER TABLE tpch.CUSTOMER
ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.NATION(N_NATIONKEY);
COMMIT WORK;
-- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
COMMIT WORK;
-- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD PRIMARY KEY (O_ORDERKEY);
COMMIT WORK;
-- For table PARTSUPP
ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.SUPPLIER(S_SUPPKEY);
COMMIT WORK;
ALTER TABLE tpch.PARTSUPP
ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.PART(P_PARTKEY);
COMMIT WORK;
-- For table ORDERS
ALTER TABLE tpch.ORDERS
ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.CUSTOMER(C_CUSTKEY);
COMMIT WORK;
-- For table LINEITEM
ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references tpch.ORDERS(O_ORDERKEY);
COMMIT WORK;
ALTER TABLE tpch.LINEITEM
ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
alter table CUSTOMER rename to customer ;
alter table LINEITEM rename to lineitem ;
alter table NATION rename to nation ;
alter table ORDERS rename to orders ;
alter table PART rename to part ;
alter table PARTSUPP rename to partsupp ;
alter table REGION rename to region ;
alter table SUPPLIER rename to supplier ;
COMMIT WORK;
# 创建索引
\. /root/tpc-h/dbgen/dss.ri
5)查看生成的索引
# 查看当前数据库所有表的索引
SELECT
table_name AS 表名,
index_name AS 索引名,
column_name AS 索引列,
non_unique AS 是否非唯一,
index_type AS 索引类型
FROM
information_schema.statistics
WHERE
table_schema = DATABASE() -- 当前数据库
ORDER BY
table_name, index_name, seq_in_index;
6)生成查询语句
# 将/tpc-h/dbgen/queries目录中的查询模板文件拷贝至dbgen目录下
cp -r ./queries/* ./
# 使用qgen生成22条SQL查询语句
cd /root/tpc-h/dbgen
# 在dbgen目录下新建query.sh文件
vi query.sh
for i in {1..22}; do /root/tpc-h/dbgen/qgen $i > /root/tpc-h/dbgen/query$i.sql; done
chmod +x query.sh
./query.sh
ls -al *.sql
7)修改查询语句
# 修改SQL查询语句
# TPC-H查询模板包含limit -1,在MySQL中会报错,需要批量移除
# 将所有 limit -1 替换为 limit 1
sed -i '$s/limit -1/limit 1/' query*.sql
# 去掉脚本中的 date 函数
sed -i 's/ date / /g' query*.sql
# 在个 SQL 文件的第一行 添加 use tpch; 语句
sed -i '1a use tpch; \n' *.sql
# 修改query1.sql文件
# 需要 将 where 条件的内容修改
# where
# l_shipdate <= date '1998-12-01' - interval '90' day (3)
# 修改为 如下
where
l_shipdate <= '1998-12-01' - interval '90' day
8)执行查询测试
# 默认表名为大写,在SQL查询语句中为小写,修改表名
ALTER TABLE `CUSTOMER` RENAME TO `customer`;
ALTER TABLE `REGION` RENAME TO `region`;
ALTER TABLE `NATION` RENAME TO `nation`;
ALTER TABLE `SUPPLIER` RENAME TO `supplier`;
ALTER TABLE `PART` RENAME TO `part`;
ALTER TABLE `PARTSUPP` RENAME TO `partsupp`;
ALTER TABLE `ORDERS` RENAME TO `orders`;
ALTER TABLE `LINEITEM` RENAME TO `lineitem`;
# 执行查询语句,并记录执行时间
source /root/tpc-h/dbgen/query8.sql
source /root/tpc-h/dbgen/query10.sql
source /root/tpc-h/dbgen/query13.sql
9)统计执行时间
查询类型 | MySQL执行时间(s) |
---|---|
Query6 | 1054.24 |
Query12 | 56.53 |
Query13 | 77 |
Query14 | 34.56 |
Query16 | 292.16 |
Query19 | 69.01 |
6.2.2 TiDB性能测试
1)创建数据库和表
测试数据量可以根据大家的机器配置自行修改,建议测试数据量为 50 GB-1 TB
# 创建数据库
mysql -u tidb -p -P 4000 -h 192.168.18.181
create database tpch;
use tpch;
# 创建表
source /root/tpc-h/dbgen/dss.ddl
2)导入数据
- 通过tiup-lightning导入数据量的表
# 安装 tiup-lightning
tar -xvf tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-arm64.tar.gz
cd tidb-ee-toolkit-v7.1.8-5.2-20250630-linux-arm64
tar -xvf tidb-lightning-v7.1.8-5.2-20250630-linux-amd64.tar.gz
tiup install tidb-lightning:v7.1.8
# 从mysql数据库中导出lineitem表为CSV
use tpch;
SELECT * INTO OUTFILE '/var/lib/mysql-files/lineitem.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM lineitem;
# 通过tiup-lightning导入数据
# CSV命名规范:tpch.LINEITEM.csv,会自动按tpch数据库LINEITEM表名导入
vi tidb-lightning.toml
[lightning]
level = "info"
file = "tidb-lightning.log"
[tikv-importer]
backend = "local"
# 设置一个容量很大的临时目录路径
sorted-kv-dir = "/home/kv"
[mydumper]
# 指定你的 CSV 文件所在的路径
data-source-dir = "/home"
[mydumper.csv]
separator = ','
delimiter = '"'
header = false # 如果 CSV 第一行是列名,改为 true
not-null = false
[tidb]
host = "192.168.18.181"
port = 4000
user = "tidb"
password = "Root#1234"
status-port = 10080
pd-addr = "192.168.18.181:2379"
# 导入数据
tiup tidb-lightning -config /home/tidb-lightning.toml
3)执行查询测试
使用MySQL测试时,生成的query1-22.sql查询语句测试即可。
# 在测试tidb时,没有生成索引
# 表名大小写也没有修改
source /root/tpc-h/dbgen/query8.sql
source /root/tpc-h/dbgen/query10.sql
source /root/tpc-h/dbgen/query13.sql
4)统计执行结果
查询类型 | TiDB执行时间(s) |
---|---|
Query6 | 30.38 |
Query12 | 36.03 |
Query14 | 31.35 |
Query16 | 5.62 |
Query17 | 144.76 |
Query19 | 42.76 |
Query20 | 18.7 |
7. 性能对比
7.1 OLTP性能对比
指标 | TiDB | MySQL | 对比 |
---|---|---|---|
Total Transaction Num | 96214 | 3481 | 快27.6倍 |
平均延迟 (ms) | 798.52 | 22365.48 | 低28倍 |
P95延迟 (ms) | 1352 | 100000 | 低74倍 |
配置:均采用128线程,600秒持续压力测试 |
在测试环境中,TiDB、TIKV等组件均部署在同一节点,数量均为1个,但TiDB表现仍然十分优异。
(1)TPS (每秒事务处理量) 分析
- TiDB 性能领先 27.6 倍
- TiDB 的分布式架构允许水平扩展,多个节点可以并行处理事务
- MySQL 的单机架构受限于单节点处理能力,存在明显瓶颈
- TiDB 采用多副本和 Region 分片机制,能够高效处理高并发请求
- MySQL 在高并发下容易出现锁竞争和资源争用
- TiDB 可以更好地利用多核CPU和分布式存储资源
- MySQL 在极端负载下可能出现资源利用不均衡
(2)平均延迟分析
- TiDB 延迟低 28 倍
- TiDB 的分布式查询优化器能够并行处理查询请求
- MySQL 的串行处理模式在高负载下导致响应时间急剧增加
- TiDB 采用分布式内存池管理,减少磁盘I/O等待
- MySQL 的缓冲池在高压力下可能频繁刷新,增加磁盘I/O
(3)P95 延迟分析
- TiDB 延迟低 74 倍
- TiDB 表现出极佳的性能一致性,P95 延迟仅比平均延迟高约70%
- MySQL 的性能波动极大,P95 延迟是平均延迟的4.5倍
- TiDB 的分布式调度避免了资源竞争导致的性能波动
- MySQL 在高并发下容易出现资源竞争,导致某些请求被"饿死"
7.2 OLAP性能对比
查询类型 | TiDB执行时间(s) | MySQL执行时间(s) | 性能提升 |
---|---|---|---|
Query6 | 30.38 | 1054.24 | +3370% |
Query12 | 36.03 | 56.53 | +56.9% |
Query14 | 31.35 | 34.56 | +10.2% |
Query16 | 5.62 | 292.16 | +5098% |
Query19 | 42.76 | 69.01 | +61.4% |
几何平均 | 23.15 | 301.3 | +1202% |
(1)TiDB 在复杂分析查询中优势明显
- 尤其在 Query6 和 Query16 上提升超过 3000% 和 5000%。
- 说明其分布式架构对大数据聚合、多表连接等操作优化显著。
(2)所有查询TiDB均优于MySQL
- 几何平均性能提升达 12 倍(+1202%),体现其整体在OLAP场景下的高性能。
(3)TiDB 更适合数据密集型分析
- 尤其是在TPC-H这类强调复杂查询、大数据扫描和聚合的场景中,其并行计算与分布式执行能力发挥出色。
- 而MySQL 在单机复杂查询上存在瓶颈,尤其是涉及大量数据扫描和聚合时,其执行时间显著高于TiDB。
8. 数据压缩对比
以Sysbench生成的测试数据,在MySQL和TiDB中的存储状况进行对比。
8.1 MySQL数据存储状况
(1)表逻辑大小
# 在 MySQL 中查询表的逻辑大小
SELECT
table_name AS '表名',
round(((data_length + index_length) / 1024 / 1024), 2) AS '大小(MB)',
round((data_length / 1024 / 1024), 2) AS '数据大小(MB)',
round((index_length / 1024 / 1024), 2) AS '索引大小(MB)',
table_rows AS '行数'
FROM information_schema.TABLES
WHERE table_schema = 'test' AND table_name LIKE 'sbtest%'
ORDER BY table_name;
- 逻辑大小:25221MB ÷ 1024 ≈ 24.63GB
(2)表占用物理磁盘大小
# 在 MySQL 中执行以下命令查找数据目录
SHOW VARIABLES LIKE 'datadir';
# 进入 MySQL 数据目录
cd /var/lib/mysql
# 查看测试数据库目录大小
du -sh test/
# 查看单个表文件大小
ls -lh test/sbtest*.ibd
# 计算所有测试表的总大小
du -ch test/sbtest*.ibd | grep total
- 表占用物理磁盘大小:29G
8.2 TiDB 数据存储状况
Step 1:先压缩:手动 compact 或等待自动 compact 的完成
https://docs.pingcap.com/zh/tidb/stable/tikv-control/#手动-compact-单个-tikv-的数据
Step 2:再查看
(1)表逻辑大小
# 方法1:查看 TiKV 中测试表的逻辑大小
SELECT SUM(data_length + index_length) AS total_logical_size
FROM information_schema.TABLES
WHERE table_schema = 'titest' AND table_name IN ('sbtest1', 'sbtest2', 'sbtest3', 'sbtest4', 'sbtest5')
# 方法2:
SELECT
table_name,
DATA_LENGTH,
INDEX_LENGTH,
(DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024 / 1024 AS total_size_GB
FROM information_schema.TABLES
WHERE table_schema = 'titest';
- 逻辑大小:2225334904 ÷ 1073741824 ≈ 2.07G
(2)表占用物理磁盘大小
- 通过TEM-参数查询,组件选择TiKV,字段data-dir,查询TiKV具体的存储路径。
- 登录tikv主机,查看目录大小
# 登录tikv主机,查看数据目录大小
du -sh /tidb1/tidb-data/tikv-20160/db
物理磁盘占用大小:13 GB
8.3 数据存储状况对比
数据大小 | TiDB | MySQL | 压缩对比 |
---|---|---|---|
表逻辑大小 | 2.07GB | 24.63GB | 低10.90倍 |
占用物理磁盘大小 | 13GB | 29GB | 低1.23倍 |
(1)极高的逻辑数据压缩率
- TiDB 的逻辑数据大小仅为 MySQL 的 1/10.9
- 说明其存储引擎(TiKV)采用了更高效的数据编码和压缩算法(如列式存储格式、字典编码、前缀压缩等),极大减少了冗余数据存储。
(2)物理磁盘占用也更优
-
尽管物理磁盘大小差距不如逻辑大小显著,但 TiDB 仍比 MySQL 节省 ~55% 的磁盘空间(13GB vs 29GB)。
- 智能压缩机制:TiKV 默认使用 Snappy 或 ZSTD 压缩数据块。
- 数据分层存储:支持冷热数据分离,进一步优化存储成本。
(3)架构存储优势
- 分布式存储引擎(TiKV):以 Region 为单位管理数据,支持自动压缩和垃圾回收(GC),减少碎片。
9. TEM易用性
TEM(TiDB Enterprise Manager)是平凯星辰推出的企业级一站式数据库管理平台,专为简化 TiDB 的运维管理、提升开发效率而设计。
9.1 核心功能
(1)集中化监控与告警
- 集群状态监控:提供全景式仪表盘,实时可视化展示集群健康状况、性能指标(如 QPS、延迟、吞吐量)、资源使用率(CPU、内存、磁盘、IO)。
- 拓扑可视化:直观展示集群内所有组件(TiDB、TiKV、PD、TiFlash)的物理部署和状态,快速定位故障节点。
(2)智能运维与管理
- 集群扩缩容:提供图形化一键扩缩容功能,可轻松增加或减少计算(TiDB)或存储(TiKV、TiFlash)节点,极大简化了分布式集群的容量调整操作。
- SQL 语句诊断:集成 SQL 诊断功能,可快速分析慢查询、定位性能瓶颈、提供优化建议,甚至支持一键抓取并可视化执行计划。
- 数据闪回:基于 TiDB 的垃圾回收(GC)机制,提供数据闪回(Flashback) 功能,可快速恢复因误操作(如
DROP TABLE
,DELETE
)而丢失的数据,极大降低数据恢复的复杂度和风险。
- 数据备份与恢复:支持全量备份、增量备份,提供图形化界面配置备份策略和点时间点恢复(PITR),保障数据安全性和业务连续性。
- 集群巡检:可定期或手动对集群进行健康巡检,自动检查配置合规性、版本兼容性、性能风险等,并生成巡检报告,帮助预防潜在问题。
9.2 易用性总结
(1)开箱即用
- 部署简单,与 TiDB 集群无缝集成,无需复杂配置
(2)图形化操作
- 将复杂的命令行操作转化为直观的图形界面点击操作(如扩缩容、备份设置等)
- 大幅降低运维门槛,使 DBA 和开发者都能高效管理数据库
(3)统一管理入口
- 提供了集监控、告警、运维、诊断、安全于一体的中心化管理平台
- 避免了在不同工具间切换的麻烦,提升了运维效率
(4)自动化与智能化
- 通过智能诊断(如 SQL 分析、巡检),减少重复性手工劳动,使运维工作更高效、更可靠
平凯星辰 TEM 的核心价值在于 “化繁为简” 。通过统一的图形化平台,将 TiDB 分布式数据库复杂的运维管理工作变得可视化、自动化、智能化,显著降低了企业用户的运维成本和技术门槛,同时通过数据闪回、备份恢复等重要功能增强了数据安全性和业务稳定性,是构建和运营 TiDB 企业级应用不可或缺的运维利器。
10. 总结
(1)极高的吞吐能力(TPS)
- TiDB 的 TPS 达到 9.6万/秒,远超 MySQL 的 3481/秒
- 说明其在高并发事务处理中能有效利用分布式资源,线性扩展能力强
(2)极低的延迟表现
- 无论是平均延迟还是 P95 延迟,TiDB 都远低于 MySQL
- 尤其是在高百分位延迟(P95)上优势更为明显(74倍)
- 说明系统响应更稳定,适合对延迟敏感的业务
(3)适用于高并发OLTP场景
- TiDB 不仅擅长OLAP(如TPC-H),在OLTP场景下也表现优异
- 真正实现了 HTAP(混合事务/分析处理) 能力
(4)架构优势体现
- 分布式架构:TiDB 通过分片(Region)和多副本机制,轻松水平扩展,避免了 MySQL 单机瓶颈。
- 自动负载均衡:PD(Placement Driver)组件智能调度数据分布和访问路由。
- 强一致性事务:基于 Google Spanner 设计的 MVCC + Percolator 事务模型,保证分布式事务的ACID。
- 计算存储分离:TiDB(计算层)与 TiKV(存储层)分离,可独立扩展,进一步提升并发处理能力。
- TiDB 在保持 MySQL 协议兼容的同时,提供了更好的扩展性和稳定性。
TiDB 不仅在分析型查询(OLAP)中表现卓越,在事务处理(OLTP)方面也具备极强的并发处理能力和低延迟特性,是一款真正的HTAP数据库。其分布式架构、线性扩展能力和稳定性使其更适合高并发、大数据量的企业级应用场景。
---------------------------------------------------------------------------------------------------------------------------
- 因技术水平、认知能力有限,以上测试方法、数据、评论如有不当之处,请大家批评、指正!谢谢!
- 也欢迎大家私信、留言互动与交流!