以下是针对 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 second 和 transactions per second。
七、优化建议
- 索引优化:缺失索引会导致全表扫描,显著降低 qps。
- sql 调优:避免复杂子查询,使用
explain
分析执行计划。 - 事务控制:减少长事务占用锁资源,适当调整隔离级别。
- 配置调优:修改
innodb_buffer_pool_size
、query_cache_size
等参数。
总结
- 轻量级监控:直接使用
show status
或mysqladmin
。 - 精细化分析:启用
performance schema
或集成 prometheus。 - 长期优化:结合慢查询日志和索引分析工具(如
explain
)提升性能。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论