当前位置: 代码网 > it编程>数据库>Mysql > 在MySQL中分析平均响应时间最长的SQL的六种方法

在MySQL中分析平均响应时间最长的SQL的六种方法

2025年10月23日 Mysql 我要评论
在mysql中分析平均响应时间最长的sql,主要有以下几种方法:1. 使用performance schema(推荐)查询平均执行时间最长的sqlselect digest_text as q

在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的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com