以下是针对 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)提升性能。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论