MySQL 压测实战:sysbench 从入门到精通

目录

      • [一、sysbench 基础介绍](#一、sysbench 基础介绍)
        • [1. 安装 sysbench](#1. 安装 sysbench)
          • [方式 1:包管理器安装(简单)](#方式 1:包管理器安装(简单))
          • [方式 2:源码编译安装(最新版本)](#方式 2:源码编译安装(最新版本))
      • [二、sysbench 压测 MySQL 核心流程](#二、sysbench 压测 MySQL 核心流程)
        • [1. 核心参数说明(通用)](#1. 核心参数说明(通用))
        • [2. 提前准备 MySQL 环境](#2. 提前准备 MySQL 环境)
      • 三、常用压测场景实战
        • [场景 1:读写混合压测(oltp_read_write)](#场景 1:读写混合压测(oltp_read_write))
          • [步骤 1:准备测试数据](#步骤 1:准备测试数据)
          • [步骤 2:执行压测](#步骤 2:执行压测)
          • [步骤 3:清理测试数据(压测完成后)](#步骤 3:清理测试数据(压测完成后))
        • [场景 2:其他常用场景(仅替换核心参数)](#场景 2:其他常用场景(仅替换核心参数))
      • 四、压测结果解读(核心指标)
      • 五、压测注意事项
      • 总结

你想全面了解如何使用 sysbench 对 MySQL 进行压测,包括安装、常用压测场景、参数配置和结果解读,我会从基础到实战一步步给你讲清楚。

一、sysbench 基础介绍

sysbench 是一款开源的、跨平台的多线程性能测试工具,支持对 CPU、内存、磁盘 I/O、数据库(主要是 MySQL)等进行压测,尤其在数据库压测中应用广泛,能模拟真实的读写负载,评估数据库的性能极限。

1. 安装 sysbench

环境说明:以 Linux(CentOS 7/8 或 Ubuntu)为例,推荐安装 1.0 及以上版本(新版语法更清晰)。

方式 1:包管理器安装(简单)
bash 复制代码
# CentOS/RHEL
yum install -y epel-release
yum install -y sysbench

# Ubuntu/Debian
apt update
apt install -y sysbench
方式 2:源码编译安装(最新版本)
bash 复制代码
# 安装依赖
yum install -y make automake libtool pkgconfig libaio-devel mysql-community-devel git

# 克隆源码
git clone https://github.com/akopytov/sysbench.git
cd sysbench

# 编译安装
./autogen.sh
./configure --with-mysql-includes=/usr/include/mysql --with-mysql-libs=/usr/lib64/mysql
make -j$(nproc)
make install

# 验证安装
sysbench --version

二、sysbench 压测 MySQL 核心流程

sysbench 压测 MySQL 分为 3 个核心步骤:准备测试数据执行压测清理测试数据

1. 核心参数说明(通用)

先熟悉常用的连接和压测参数,后续所有场景都会用到:

参数 说明
--mysql-host MySQL 服务器地址(默认 127.0.0.1)
--mysql-port MySQL 端口(默认 3306)
--mysql-user 连接 MySQL 的用户名
--mysql-password 连接 MySQL 的密码
--mysql-db 测试用的数据库名(需提前创建)
--table-size 每个测试表的行数(核心参数,决定数据量)
--tables 测试表的数量
--threads 并发线程数(模拟并发用户数)
--time 压测持续时间(秒,默认 10)
--report-interval 每隔几秒输出一次压测进度(秒)
2. 提前准备 MySQL 环境
sql 复制代码
-- 1. 创建测试数据库
CREATE DATABASE IF NOT EXISTS sysbench_test;

-- 2. 创建有足够权限的用户(避免用 root 压测)
CREATE USER 'sysbench'@'%' IDENTIFIED BY 'Sysbench@123';
GRANT ALL PRIVILEGES ON sysbench_test.* TO 'sysbench'@'%';
FLUSH PRIVILEGES;

三、常用压测场景实战

sysbench 对 MySQL 的压测主要有 4 个核心场景:只读(oltp_read_only)只写(oltp_write_only)读写混合(oltp_read_write)纯插入(oltp_insert),以下以最常用的「读写混合」为例讲解完整流程。

场景 1:读写混合压测(oltp_read_write)
步骤 1:准备测试数据
bash 复制代码
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--table-size=1000000 \  # 每个表 100 万行
--tables=10 \            # 共 10 个表(总数据量 1000 万行)
--db-driver=mysql \
prepare  # 准备数据的核心指令
  • 执行后,sysbench 会在 sysbench_test 库中创建 10 张名为 sbtest1~sbtest10 的测试表;
  • 数据量根据服务器配置调整:低配服务器(1C2G)建议 table-size=100000,高配服务器(8C16G)可设 table-size=5000000
步骤 2:执行压测
bash 复制代码
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--table-size=1000000 \
--tables=10 \
--threads=64 \  # 64 并发线程(根据 CPU 核心数调整,一般为 CPU 核心数的 2 倍)
--time=60 \     # 压测持续 60 秒
--report-interval=10 \  # 每 10 秒输出一次进度
--db-driver=mysql \
run  # 执行压测的核心指令
步骤 3:清理测试数据(压测完成后)
bash 复制代码
sysbench oltp_read_write \
--mysql-host=127.0.0.1 \
--mysql-port=3306 \
--mysql-user=sysbench \
--mysql-password=Sysbench@123 \
--mysql-db=sysbench_test \
--tables=10 \
--db-driver=mysql \
cleanup  # 清理数据的核心指令
场景 2:其他常用场景(仅替换核心参数)
  • 只读压测:将 oltp_read_write 替换为 oltp_read_only
  • 只写压测:替换为 oltp_write_only
  • 纯插入压测:替换为 oltp_insert
  • 删改混合压测:替换为 oltp_deleteoltp_update_index

四、压测结果解读(核心指标)

压测结束后会输出详细结果,重点关注以下核心指标(以读写混合压测为例):

复制代码
SQL statistics:
    queries performed:
        read:                            103200  # 读请求总数
        write:                           29486   # 写请求总数
        other:                           14743   # 其他请求(如事务提交)
        total:                           147429  # 总请求数
    transactions:                        7371   (122.83 per sec.)  # 核心:TPS(每秒事务数)
    queries:                             147429 (2456.60 per sec.) # QPS(每秒查询数)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)

General statistics:
    total time:                          60.0010s  # 实际压测时长
    total number of events:              7371      # 总事务数
    total time taken by event execution: 3836.1251s # 所有线程执行事件的总耗时
    response time:
         min:                                  19.02ms  # 事务最小响应时间
         avg:                                  520.43ms # 事务平均响应时间
         max:                                 2980.15ms # 事务最大响应时间
         95th percentile:                     1200.50ms # 95%事务的响应时间(重点关注)
  • 核心指标:TPS(每秒事务数)、QPS(每秒查询数)越高越好;95th percentile(95%响应时间)越低越好;
  • 参考标准:8C16G 服务器 + MySQL 8.0,读写混合压测 TPS 一般能达到 1000+,QPS 20000+,95% 响应时间 < 1s 为正常。

五、压测注意事项

  1. 压测环境隔离:不要在生产库直接压测,单独搭建和生产配置一致的测试环境;
  2. 参数调优 :压测前可先优化 MySQL 核心参数(如 innodb_buffer_pool_sizemax_connectionsinnodb_flush_log_at_trx_commit);
  3. 逐步增加并发:从低并发(如 8、16)开始,逐步增加到 64、128,找到数据库的性能拐点;
  4. 监控配套 :压测时用 topiostatvmstat 监控服务器 CPU、磁盘 IO、内存使用,定位性能瓶颈(如 IO 打满则需优化磁盘,CPU 打满则需优化 SQL 或数据库参数)。

总结

  1. sysbench 压测 MySQL 的核心流程是「准备数据 → 执行压测 → 清理数据」,核心参数需关注 table-size(单表行数)、tables(表数量)、threads(并发数);
  2. 核心压测指标为 TPS(每秒事务数)、QPS(每秒查询数)、95% 响应时间,前两者越高、后者越低,数据库性能越好;
  3. 压测时需隔离环境、逐步增加并发,并结合服务器监控定位性能瓶颈,而非仅看数值。
相关推荐
数智化管理手记35 分钟前
主数据重复、错漏频发?一站式主数据管理平台如何落地?
大数据·运维·数据库·人工智能·数据挖掘
吴声子夜歌39 分钟前
MongoDB 4.2——选择片键
数据库·mongodb
天天进步一点点1 小时前
QSqlQuery删除sqlite数据库执行drop数据表报错database table is locked unable to fetch row问题
数据库·oracle·sqlite
音视频工程实战1 小时前
PromptQL 新手入门与实战指南
数据库·sql·算法
清川渡水2 小时前
NL2SQL 的正确打开方式:从「AI 猜 SQL」到「置信度闭环」的工程化落地
数据库·人工智能·sql
TDengine (老段)2 小时前
TDengine Go 与 Rust 连接器 — 高性能异步访问
大数据·数据库·物联网·golang·rust·时序数据库·tdengine
东方佑2 小时前
MA-RMSNorm:打破“缩放换智能”的魔咒,大模型归一化的一次范式革命!
数据库·人工智能·计算机视觉
云和恩墨3 小时前
「云帆计划·长沙站」活动成功举办,云和恩墨与紫薇垣和湖南金悦科技分别签约并授牌,本地伙伴生态建设加速
数据库·科技
千维百策6664 小时前
如何管理错误预算:提升服务可靠性与 SLO 达成率的实践经验
服务器·网络·数据库
Y3815326625 小时前
2026 年 7 月,SERP API 调用的稳定性实战:超时、重试、降级
开发语言·数据库·人工智能·php