当前位置: 代码网 > it编程>数据库>MsSqlserver > SQL性能优化之慢SQL查询方法与排查

SQL性能优化之慢SQL查询方法与排查

2026年04月01日 MsSqlserver 我要评论
适用版本:mysql 5.7 / 8.0今天聊一聊sql优化的问题,怎么找到那些慢sql。一、什么是慢 sql慢 sql 是指执行时间超过预设阈值的 sql 语句。在 mysql 中,这个阈值由参数

适用版本:mysql 5.7 / 8.0

今天聊一聊sql优化的问题,怎么找到那些慢sql。

一、什么是慢 sql

慢 sql 是指执行时间超过预设阈值的 sql 语句。在 mysql 中,这个阈值由参数 long_query_time 控制,默认值为 10 秒,实际生产环境中通常设置为 1~2 秒。

慢 sql 是数据库性能问题最常见的根源,主要表现为:

  • 页面响应缓慢,接口超时
  • 数据库 cpu 飙高,连接数堆积
  • 锁等待,导致其他业务也受影响

二、开启慢查询日志

要找到慢 sql,首先需要开启 mysql 的慢查询日志功能。

2.1 查看当前状态

show variables like 'slow_query%';
show variables like 'long_query_time';

2.2 临时开启(重启后失效)

-- 开启慢查询日志
set global slow_query_log = 'on';

-- 设置阈值:超过 2 秒算慢 sql
set global long_query_time = 2;

-- 设置日志输出到表(推荐,方便直接查询)
set global log_output = 'table';

2.3 永久生效(修改配置文件)

编辑 mysql 配置文件 my.cnf(linux)或 my.ini(windows):

[mysqld]
slow_query_log = 1
long_query_time = 2
log_output = table
log_queries_not_using_indexes = 1   # 同时记录未使用索引的 sql

建议log_queries_not_using_indexes = 1 非常有用,即使执行很快但没走索引的 sql 也会被记录,可以提前发现潜在隐患。

三、方法一:查询 slow_log 表

log_output = table 时,慢 sql 会写入 mysql.slow_log 表,可以直接用 sql 查询。

3.1 查询最近的慢 sql

select
    start_time,
    round(time_to_sec(query_time), 3) as 执行秒数,
    round(time_to_sec(lock_time), 3)  as 锁等待秒数,
    rows_examined                      as 扫描行数,
    rows_sent                          as 返回行数,
    db                                 as 数据库,
    sql_text                           as sql内容
from mysql.slow_log
order by query_time desc
limit 20;

3.2 按数据库筛选

select * from mysql.slow_log
where db = 'your_database'
order by query_time desc
limit 20;

四、方法二:performance_schema 分析

performance_schema 是 mysql 内置的性能数据采集框架,能统计所有 sql 的累计执行情况,找出高频且耗时的 sql。

4.1 查询最耗时的 top 10 sql

select
    digest_text                                           as sql摘要,
    count_star                                            as 执行次数,
    round(avg_timer_wait / 1000000000000, 3)             as 平均耗时秒,
    round(max_timer_wait / 1000000000000, 3)             as 最大耗时秒,
    round(sum_timer_wait / 1000000000000, 3)             as 总耗时秒,
    sum_rows_examined                                     as 总扫描行数
from performance_schema.events_statements_summary_by_digest
order by sum_timer_wait desc
limit 10;

4.2 通过 sys schema 更简便地查询

sys schema 是对 performance_schema 的封装,sql 更简洁易读:

-- 查询最耗时的 sql(按总耗时排序)
select * from sys.statement_analysis
order by total_latency desc
limit 10;

-- 查询全表扫描最多的 sql
select * from sys.statements_with_full_table_scans
order by no_index_used_count desc
limit 10;

五、方法三:工具客户端分析

5.1 mysql workbench(推荐)

连接数据库后,在左侧导航找到 performance 菜单:

  • performance → dashboard:实时监控面板,查看 qps、连接数、缓冲池等
  • performance → statement analysis:列出所有 sql 及其平均耗时、执行次数
  • performance → query statistics:按类型统计 select/insert/update 的耗时占比

5.2 dbeaver

  • 执行 sql 后,底部结果面板直接显示执行时间
  • window → query manager:查看历史 sql 及每条的耗时
  • 选中 sql → ctrl+shift+e:图形化执行计划

5.3 percona pmm(生产环境推荐)

pmm(percona monitoring and management)是专业的 mysql 监控平台,适合生产环境:

  • query analytics 面板:实时展示所有 sql 的执行频率和耗时
  • 支持按时间段过滤,定位某次性能抖动期间的慢 sql
  • 可下钻到单条 sql 查看执行计划和历史趋势

六、找到慢 sql 后如何分析

找到慢 sql 只是第一步,接下来需要通过执行计划(explain)分析慢的原因。

6.1 使用 explain 分析

explain select * from orders where user_id = 123 and status = 1;

-- mysql 8.0+ 支持更详细的 explain analyze
explain analyze select * from orders where user_id = 123 and status = 1;

6.2 关键字段解读

字段关注点说明
type最重要all = 全表扫描(差),ref / eq_ref = 走索引(好)
key是否用索引null 表示未使用任何索引
rows扫描行数数值越大性能越差
extra附加信息using filesort / using temporary 需要重点优化
filtered过滤比例越低代表从扫描结果中筛选越多,效率越低

6.3 常见慢 sql 原因

  • 未建索引,或索引建了但没有命中(索引失效)
  • sql 写法导致索引失效,例如对索引列使用函数、隐式类型转换
  • select * 拉取了不必要的列,返回数据量过大
  • join 关联字段未建索引,产生笛卡尔积
  • 数据量大但没有分页,一次查询百万行数据

七、排查流程总结

步骤操作工具
第一步开启慢查询日志set global slow_query_log='on'
第二步收集慢 sql 列表查询 mysql.slow_log 或 sys.statement_analysis
第三步找出最耗时的 sql按 query_time 降序排列,取 top 10
第四步分析执行计划explain 命令 或 dbeaver / workbench 图形化
第五步定位慢的原因看 type / key / rows / extra 字段
第六步优化处理加索引、改写 sql、分页、分库分表等

八、常用命令速查

-- 查看慢查询配置
show variables like 'slow%';

-- 开启慢查询日志
set global slow_query_log = 'on';

-- 设置慢查询阈值(秒)
set global long_query_time = 2;

-- 查询慢 sql 列表
select * from mysql.slow_log order by query_time desc limit 20;

-- 查 top 10 耗时 sql
select * from sys.statement_analysis limit 10;

-- 查全表扫描的 sql
select * from sys.statements_with_full_table_scans limit 10;

-- 分析执行计划
explain select ...;

-- 详细执行计划(mysql 8.0+)
explain analyze select ...;

-- 清空慢日志表
truncate table mysql.slow_log;

小结:慢 sql 排查的核心思路是「先发现、再定位、后优化」。建议在测试和生产环境都长期开启慢查询日志,并定期检查 sys.statement_analysis,做到防患于未然。

到此这篇关于sql性能优化之慢sql查询方法与排查的文章就介绍到这了,更多相关慢sql查询方法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

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

发表评论

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