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