MySQL数据,查询QPS,TPS数据方式

 更新时间:2025年02月27日 09:29:37   作者:会飞的土拨鼠呀  
文章详细介绍了查询MySQL数据库QPS和TPS的方法和工具,包括直接通过命令行、PerformanceSchema、mysqladmin、Prometheus、自动化脚本等,同时,还提供了优化建议,如索引优化、SQL调优、事务控制和配置调优

以下是针对 MySQL 数据库 QPS(Queries Per Second)和 TPS(Transactions Per Second)数据 的详细查询方法和工具推荐,包含具体命令和示例:

一、直接通过 MySQL 命令行查询

1. 查询 QPS

-- 获取当前总查询次数(所有类型)
SHOW STATUS LIKE 'Queries';

-- 计算过去 N 秒的 QPS(例如 N=5)
SELECT 
    (NOW() - INTERVAL 5 SECOND) AS 时间差,  
    (SHOW STATUS LIKE 'Queries') - prev_queries AS 当前查询总数,
    ROUND((当前查询总数 / 时间差.total_seconds), 2) AS QPS
FROM 
    (SELECT SHOW STATUS LIKE 'Queries' AS prev_queries) AS subquery,
    (SELECT NOW() - INTERVAL 5 SECOND AS time_diff) AS time_diff;

2. 查询 TPS

-- 获取当前事务提交次数
SHOW STATUS LIKE 'Com_commit';

-- 计算过去 N 秒的 TPS(例如 N=5)
SELECT 
    (NOW() - INTERVAL 5 SECOND) AS 时间差,  
    (SHOW STATUS LIKE 'Com_commit') - prev_commits AS 当前提交总数,
    ROUND((当前提交总数 / 时间差.total_seconds), 2) AS TPS
FROM 
    (SELECT SHOW STATUS LIKE 'Com_commit' AS prev_commits) AS subquery,
    (SELECT NOW() - INTERVAL 5 SECOND AS time_diff) AS time_diff;

二、使用 Performance Schema(推荐)

1. 启用 Performance Schema

-- 检查是否已启用
SHOW VARIABLES LIKE 'performance_schema';

-- 若未启用,在 `my.cnf` 中添加:
[mysqld]
performance_schema = ON

2. 查询 QPS(按语句类型统计)

SELECT 
    event_name       AS 查询类型,  
    COUNT_STAR        AS 总执行次数,  
    AVG_TIMER_WAIT    AS 平均延迟(微秒),  
    SUM_TIMER_WAIT    AS 总延迟(微秒)
FROM 
    performance_schema.events_statements_summary_by_digest
WHERE 
    event_name IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE')
ORDER BY 
    COUNT_STAR DESC;

3. 查询 TPS(按事务提交统计)

SELECT 
    event_name       AS 事务类型,  
    COUNT_STAR        AS 提交次数,  
    AVG_TIMER_WAIT    AS 平均延迟(微秒)
FROM 
    performance_schema.events_statements_summary_by_digest
WHERE 
    event_name = 'COMMIT';

三、使用 mysqladmin 工具

1. 查看实时状态

# 查看所有关键状态变量(包含 QPS 和 TPS)
mysqladmin -u root -p status

# 仅查看 QPS、TPS 和连接数
mysqladmin -u root -p extended-status | grep -E 'Queries|Com_commit|Threads_connected'

四、使用 Prometheus + mysql_exporter

1. 部署 mysql_exporter

# 下载并运行 mysql_exporter
wget https://github.com/prometheus/mysqld_exporter/releases/download/v1.16.0/mysqld_exporter-1.16.0.linux-amd64.tar.gz
tar xvfz mysqld_exporter-*.tar.gz
cd mysqld_exporter-*/
./mysqld_exporter

# Prometheus 配置(`prometheus.yml`)
scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['localhost:9104']

2. 查询 QPS 和 TPS

# QPS:所有查询速率(每秒执行次数)
rate(mysql_statements_total{statement_type=~"SELECT|INSERT|UPDATE|DELETE"}[5m])

# TPS:事务提交速率(每秒提交次数)
rate(mysql_statements_total{statement_type="COMMIT"}[5m])

3. 可视化仪表盘

  • 在 Grafana 中添加 MySQL 监控面板,展示实时 QPS、TPS、慢查询等指标。

五、自动化脚本(Python 示例)

import mysql.connector
import time

def get_mysql_stats(host, user, password, db):
    conn = mysql.connector.connect(
        host=host,
        user=user,
        password=password,
        database=db
    )
    cursor = conn.cursor()
    
    # 查询 QPS
    cursor.execute("SHOW STATUS LIKE 'Queries'")
    queries_total = int(cursor.fetchone()[1])
    
    # 查询 TPS
    cursor.execute("SHOW STATUS LIKE 'Com_commit'")
    commits_total = int(cursor.fetchone()[1])
    
    cursor.close()
    conn.close()
    return queries_total, commits_total

if __name__ == "__main__":
    host = 'localhost'
    user = 'root'
    password = 'password'
    db = 'test'
    
    prev_queries, prev_commits = get_mysql_stats(host, user, password, db)
    
    while True:
        time.sleep(5)
        current_queries, current_commits = get_mysql_stats(host, user, password, db)
        
        qps = (current_queries - prev_queries) / 5
        tps = (current_commits - prev_commits) / 5
        
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] QPS={qps:.2f}, TPS={tps:.2f}")
        
        prev_queries, prev_commits = current_queries, current_commits

六、其他工具

1. Percona Toolkit 的 pt-query-digest

# 分析慢查询日志并统计 QPS/TPS
pt-query-digest --slow-log=/var/log/mysql/slow.log --output=report

2. MySQL Workbench 的监控面板

  • 打开 Server Status 选项卡,直接查看 Queries per secondTransactions per second

七、优化建议

  1. 索引优化:缺失索引会导致全表扫描,显著降低 QPS。
  2. SQL 调优:避免复杂子查询,使用 EXPLAIN 分析执行计划。
  3. 事务控制:减少长事务占用锁资源,适当调整隔离级别。
  4. 配置调优:修改 innodb_buffer_pool_sizequery_cache_size 等参数。

总结

  • 轻量级监控:直接使用 SHOW STATUSmysqladmin
  • 精细化分析:启用 Performance Schema 或集成 Prometheus。
  • 长期优化:结合慢查询日志和索引分析工具(如 EXPLAIN)提升性能。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL学习之日期函数的用法详解

    MySQL学习之日期函数的用法详解

    本文将学习MySQL的日期函数,在前面章节的练习中,我们就利用过NOW()函数来获取过当前系统时间,用DATEDIFF函数来计算日期相差的天数,接下来我们就系统的学习一下 日期函数
    2022-08-08
  • mysql 分组函数和分组查询使用详解

    mysql 分组函数和分组查询使用详解

    分组函数用作统计使用,又称聚合函数,统计函数,组函数,这篇文章主要介绍了mysql分组函数分组查询的操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • MySQL数据库远程访问权限设置方式

    MySQL数据库远程访问权限设置方式

    这篇文章主要介绍了MySQL数据库远程访问权限设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • MySQL中如何计算同比和环比

    MySQL中如何计算同比和环比

    在工作的过程中,经常会使用到环比、同比,下面这篇文章主要给大家介绍了关于MySQL中如何计算同比和环比的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • MySQL分区之子分区详解

    MySQL分区之子分区详解

    子分区(subpartition)是分区表中对每个分区的再次分割,又被称为复合分区,下面这篇文章主要给大家介绍了关于MySQL分区之子分区的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • 详细分析mysql MDL元数据锁

    详细分析mysql MDL元数据锁

    这篇文章主要介绍了mysql MDL元数据锁的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • MySQL使用GROUP BY使用技巧和注意事项总结

    MySQL使用GROUP BY使用技巧和注意事项总结

    GROUP BY 子句是 在MySQL 中用于将查询结果按照指定的列或表达式进行分组的关键字,它通常与聚合函数一起使用,能够对每个分组进行统计或计算,本文给大家总结了MySQL使用GROUP BY使用技巧和注意事项,需要的朋友可以参考下
    2024-05-05
  • 一文带你学透SQL语言的核心之DML操作

    一文带你学透SQL语言的核心之DML操作

    DML(Data Manipulation Language)是SQL语言的核心部分,其主要用于对数据库的数据进行增删改查,在学习数据时,学习DML操作是必不可少的一部分,本文就带大家详细了解SQL语言的核心DML操作,需要的朋友可以参考下
    2023-06-06
  • centos7中如何利用crontab进行mysql定时备份

    centos7中如何利用crontab进行mysql定时备份

    crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令,下面这篇文章主要给大家介绍了关于centos7中如何利用crontab进行mysql定时备份的相关资料,需要的朋友可以参考下
    2022-02-02
  • mysql 5.7.23 安装配置图文教程

    mysql 5.7.23 安装配置图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.23 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论