如何查询MySQL特定时间段内执行的总查询数及各查询执行时长
MySQL查询过去24小时总执行查询数及单条查询耗时的实现方案
以下是几种生产环境可用的落地方式,可根据业务场景选择:
方法1:使用Performance Schema(生产环境优先推荐)
MySQL 5.7及以上版本默认开启该组件,无需重启服务,性能损耗极低,适合长期采集使用:
- 先确认组件开启状态,执行命令:
SHOW VARIABLES LIKE 'performance_schema';
返回值为ON即为已启用,若为OFF需要修改my.cnf配置文件添加performance_schema=ON后重启服务生效。 - 开启语句事件采集规则:
-- 开启长历史语句消费器 UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME = 'events_statements_history_long'; -- 开启所有语句类型的采集和计时 UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%';
提前调整
performance_schema_events_statements_history_long_size参数,根据业务QPS估算24小时产生的查询量,设置足够大的存储行数,避免数据被循环覆盖。
- 统计过去24小时总查询数:
SELECT COUNT(*) AS total_queries FROM performance_schema.events_statements_history_long WHERE TIMER_START > NOW() - INTERVAL 24 HOUR; - 查询每条语句的执行耗时(单位转换为毫秒):
SELECT SQL_TEXT, TIMER_WAIT/1000000 AS execute_duration_ms FROM performance_schema.events_statements_history_long WHERE TIMER_START > NOW() - INTERVAL 24 HOUR ORDER BY execute_duration_ms DESC;
方法2:使用慢查询日志(临时排查适用)
通过调整慢查询阈值实现全量查询记录,适合短期采集场景:
- 临时开启全量慢查询日志:
SET GLOBAL slow_query_log = 'ON'; -- 阈值设为0,所有查询都会被记录 SET GLOBAL long_query_time = 0; SET GLOBAL log_output = 'FILE'; -- 替换为实际的日志存储路径,确保MySQL进程有写入权限 SET GLOBAL slow_query_log_file = '/data/mysql/logs/all_query_slow.log';
- 采集满24小时后立即改回原有配置,避免占用过多磁盘资源:
SET GLOBAL long_query_time = 你的原有慢查询阈值; - 解析日志获取统计结果:
使用percona工具集的pt-query-digest可直接统计总查询数,执行命令:pt-query-digest /data/mysql/logs/all_query_slow.log | grep "Total queries"
日志中每条记录的Query_time字段即为单条查询的执行时长,可直接批量提取。
注意:高QPS生产环境开启全量慢查询会产生大量日志,占用较多磁盘IO和存储空间,仅建议短期排查使用,采集完成后务必及时恢复原有配置。
方法3:通用查询日志(不推荐生产使用)
通用查询日志会记录所有到达MySQL实例的请求,但性能损耗极高,仅适合极低QPS的测试环境临时使用,开启命令:SET GLOBAL general_log = 'ON';
采集完成后执行SET GLOBAL general_log = 'OFF';关闭即可,日志中可直接读取每条查询的执行时间和耗时。
内容的提问来源于stack exchange,提问作者adil khan
相关产品推荐
相关产品推荐

