在MySQL中分析平均响应时间最长的SQL的六种方法
更新时间:2025年10月23日 09:08:11 作者:学亮编程手记
这篇文章主要介绍了在MySQL中分析平均响应时间最长的SQL的六种方法,主要方法包括使用PerformanceSchema、SysSchema、慢查询日志、详细性能分析、按模式分类、实时监控和快照对比,推荐结合使用,需要的朋友可以参考下
在MySQL中分析平均响应时间最长的SQL,主要有以下几种方法:
1. 使用Performance Schema(推荐)
查询平均执行时间最长的SQL
SELECT
DIGEST_TEXT AS query,
SCHEMA_NAME AS db,
COUNT_STAR AS exec_count,
ROUND(AVG_TIMER_WAIT/1000000000000, 6) AS avg_exec_time_sec,
ROUND(MAX_TIMER_WAIT/1000000000000, 6) AS max_exec_time_sec,
ROUND(SUM_TIMER_WAIT/1000000000000, 6) AS total_exec_time_sec,
SUM_ROWS_EXAMINED AS rows_examined,
SUM_ROWS_SENT AS rows_sent,
SUM_CREATED_TMP_TABLES AS tmp_tables,
SUM_SORT_MERGE_PASSES AS sort_merge_passes
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
AND COUNT_STAR > 0
ORDER BY avg_exec_time_sec DESC
LIMIT 15;
2. 使用Sys Schema(MySQL 5.7+)
查看平均执行时间最长的语句
-- 按平均执行时间排序
SELECT
query,
db,
exec_count,
total_latency,
avg_latency,
max_latency,
rows_sent_avg,
rows_examined_avg
FROM sys.statement_analysis
ORDER BY avg_latency DESC
LIMIT 15;
-- 查看95%分位的慢查询
SELECT
query,
db,
exec_count,
total_latency,
avg_latency,
max_latency
FROM sys.statements_with_runtimes_in_95th_percentile
ORDER BY avg_latency DESC
LIMIT 15;
3. 使用慢查询日志分析
使用mysqldumpslow
# 按平均查询时间排序 mysqldumpslow -s at -t 10 /var/log/mysql/slow.log
4. 详细的Performance Schema分析
包含更多性能指标
SELECT
DIGEST_TEXT AS query,
SCHEMA_NAME AS db,
COUNT_STAR AS exec_count,
-- 时间统计(单位:秒)
ROUND(AVG_TIMER_WAIT/1000000000000, 4) AS avg_exec_time_sec,
ROUND(MAX_TIMER_WAIT/1000000000000, 4) AS max_exec_time_sec,
ROUND(SUM_TIMER_WAIT/1000000000000, 4) AS total_exec_time_sec,
-- 锁时间统计
ROUND(AVG_LOCK_TIMER_WAIT/1000000000000, 4) AS avg_lock_time_sec,
-- 行统计
SUM_ROWS_EXAMINED AS rows_examined,
SUM_ROWS_SENT AS rows_sent,
SUM_ROWS_AFFECTED AS rows_affected,
ROUND(SUM_ROWS_EXAMINED / COUNT_STAR, 0) AS avg_rows_examined,
ROUND(SUM_ROWS_SENT / COUNT_STAR, 0) AS avg_rows_sent,
-- 临时表和文件排序
SUM_CREATED_TMP_TABLES AS tmp_tables,
SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables,
SUM_SORT_MERGE_PASSES AS sort_merge_passes,
SUM_SORT_ROWS AS sort_rows,
-- 错误和警告
SUM_ERRORS AS errors,
SUM_WARNINGS AS warnings,
FIRST_SEEN AS first_seen,
LAST_SEEN AS last_seen
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
AND COUNT_STAR > 0
HAVING avg_exec_time_sec > 0.001 -- 只关注平均执行时间大于1ms的查询
ORDER BY avg_exec_time_sec DESC
LIMIT 20;
5. 按模式分类分析
分析不同类型的SQL性能
SELECT
CASE
WHEN DIGEST_TEXT LIKE 'SELECT%' THEN 'SELECT'
WHEN DIGEST_TEXT LIKE 'INSERT%' THEN 'INSERT'
WHEN DIGEST_TEXT LIKE 'UPDATE%' THEN 'UPDATE'
WHEN DIGEST_TEXT LIKE 'DELETE%' THEN 'DELETE'
ELSE 'OTHER'
END AS sql_type,
COUNT(*) AS query_count,
ROUND(AVG(AVG_TIMER_WAIT/1000000000000), 4) AS avg_exec_time_sec,
ROUND(MAX(MAX_TIMER_WAIT/1000000000000), 4) AS max_exec_time_sec,
SUM(COUNT_STAR) AS total_executions
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
GROUP BY sql_type
ORDER BY avg_exec_time_sec DESC;
6. 实时监控长时间运行的查询
-- 查看当前正在执行的慢查询
SELECT
p.ID AS process_id,
p.USER AS user,
p.HOST AS host,
p.DB AS database_name,
p.TIME AS execution_time_sec,
p.COMMAND AS command,
p.STATE AS state,
LEFT(p.INFO, 200) AS query_snippet
FROM INFORMATION_SCHEMA.PROCESSLIST p
WHERE p.COMMAND = 'Query'
AND p.TIME > 5 -- 执行时间超过5秒的查询
ORDER BY p.TIME DESC;
7. 定期性能快照对比
-- 创建性能快照表(用于趋势分析)
CREATE TABLE IF NOT EXISTS query_performance_snapshot (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
snapshot_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
digest VARCHAR(64),
query_text TEXT,
avg_exec_time_sec DECIMAL(10,6),
exec_count BIGINT,
db_name VARCHAR(64)
);
-- 插入当前性能数据
INSERT INTO query_performance_snapshot (digest, query_text, avg_exec_time_sec, exec_count, db_name)
SELECT
DIGEST AS digest,
LEFT(DIGEST_TEXT, 1000) AS query_text,
ROUND(AVG_TIMER_WAIT/1000000000000, 6) AS avg_exec_time_sec,
COUNT_STAR AS exec_count,
SCHEMA_NAME AS db_name
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
AND COUNT_STAR > 0;
-- 查询性能变化趋势
SELECT
query_text,
AVG(avg_exec_time_sec) AS historical_avg,
MAX(avg_exec_time_sec) AS historical_max,
COUNT(*) AS snapshot_count
FROM query_performance_snapshot
GROUP BY digest, query_text
ORDER BY historical_avg DESC
LIMIT 10;
使用建议
- 生产环境推荐:使用Performance Schema + Sys Schema组合
- 深度分析:结合慢查询日志使用pt-query-digest
- 实时监控:设置阈值告警长时间运行的查询
- 定期审查:建立定期性能分析机制
以上就是在MySQL中分析平均响应时间最长的SQL的六种方法的详细内容,更多关于MySQL分析平均响应时间最长的SQL的资料请关注脚本之家其它相关文章!
相关文章
Navicat连接MySQL提示1045错误解决(重置MySQL密码)
连接MySQL数据库时难免会遇到1045错误,主要是因为用户输入的用户名或密码错误被拒绝访问,如果不想重装,需要找回密码或者重置密码,这篇文章主要给大家介绍了关于Navicat连接MySQL提示1045错误解决的方法,主要是重置MySQL密码,需要的朋友可以参考下2023-04-04
SQL中distinct去重关键字使用和count统计组合使用方法
这篇文章主要给大家介绍了关于SQL中distinct去重关键字使用和count统计组合使用的相关资料,count()是SQL中提供的用于统计记录数量的函数,需要的朋友可以参考下2024-08-08
mysql DISTINCT选取多个字段,获取distinct后的行信息方式
这篇文章主要介绍了mysql DISTINCT选取多个字段,获取distinct后的行信息方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01
MySql中的IFNULL、NULLIF和ISNULL用法详解
本文主要介绍了MySql中的IFNULL、NULLIF和ISNULL用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-03-03
深入解析MySQL中的Redo Log、Undo Log和Binlog
本文详细介绍了MySQL中的RedoLog、UndoLog和Binlog的背景、业务场景、功能、底层实现原理以及使用措施,通过Java代码示例展示了如何与这些日志进行交互,进一步深化了对MySQL日志系统的理解,理解并合理使用这些日志,可以有效地提升数据库的性能和可靠性2024-10-10
如何通过mysql-connector-java实现Java与MySQL的连接详解
在Java中连接MySQL数据库是实现数据持久化存储和读取的重要技能之一,这篇文章主要介绍了如何通过mysql-connector-java实现Java与MySQL连接的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下2025-08-08


最新评论