0

0

SQL 慢查询日志开启后如何快速定位高频 SQL

冷炫風刃

冷炫風刃

发布时间:2026-01-28 21:32:34

|

932人浏览过

|

来源于php中文网

原创

用 mysqldumpslow -s c -t 20 日志路径按执行次数排序取前20,它自动归一化参数识别模板级高频SQL;PostgreSQL则通过 pg_stat_statements 扩展查 calls 字段排序。

sql 慢查询日志开启后如何快速定位高频 sql

MySQL 慢查询日志里怎么筛出执行次数最多的 SQL?

慢查询日志(slow_query_log)默认只记录耗时超阈值的语句,不自带频次统计。想快速定位“高频 SQL”,得靠后处理:先确保日志格式支持解析,再用命令行工具聚合。

  • 确保 log_output 设为 FILETABLE(推荐 FILE,便于用 mysqldumpslowawk 处理)
  • 开启 long_query_time = 0 可捕获所有查询(仅限调试,线上慎用)
  • 若用 log_output = TABLE,数据存在 mysql.slow_log 表,但默认不索引 sql_textGROUP BY 效率低

常用做法是导出日志文件后用 mysqldumpslow

mysqldumpslow -s c -t 20 /var/lib/mysql/slow.log

其中 -s c 表示按执行次数排序,-t 20 取前 20 条。注意:它会自动归一化参数(如把 WHERE id = 123WHERE id = 456 视为同一条),适合识别模板级高频语句。

PostgreSQL 的 pg_stat_statements 怎么查调用最频繁的 SQL?

PostgreSQL 不依赖文本日志,而是靠扩展 pg_stat_statements 实时统计。它天然记录 calls(执行次数)、total_timemean_time 等字段,查高频 SQL 更直接。

  • 需先在 postgresql.conf 中启用:shared_preload_libraries = 'pg_stat_statements',并重启
  • 执行 CREATE EXTENSION pg_stat_statements;
  • 查询示例:
    SELECT calls, total_time, query FROM pg_stat_statements ORDER BY calls DESC LIMIT 10;

注意三点:

  • query 字段是归一化后的语句(常量被 $1 替代),和实际日志里的原始 SQL 不完全一致
  • 默认只跟踪 top-N 查询(由 pg_stat_statements.max 控制,建议设为 10000+)
  • 数据不清零,长期运行后可能掩盖近期突增的高频语句,可定期用 pg_stat_statements_reset() 清空重计

为什么用正则或 grep 直接扫慢日志容易漏掉高频 SQL?

直接对 MySQL 慢查询日志做 grepawk '{print $NF}' 是常见误区,问题在于:

SoftGist
SoftGist

SoftGist是一个软件工具目录站,每天为您带来最好、最令人兴奋的软件新产品。

下载
  • 日志每条记录包含多行(# Time# User@Host# Query_time、实际 SQL),简单按行切分会导致 SQL 被截断或错位
  • 同一逻辑 SQL 参数不同(如 SELECT * FROM orders WHERE user_id = 1001 vs ...user_id = 1002)会被当作两条,无法聚合成“同一类”
  • 未过滤注释、空行、非查询语句(如 SETUSE),干扰统计结果

更稳妥的做法是用 pt-query-digest(Percona Toolkit):

  • 自动解析日志结构,提取完整 SQL
  • 支持按 fingerprint(抽象语法树哈希)归类,比简单正则可靠得多
  • 可输出调用频次、平均延迟、锁等待时间等多维指标

高频 SQL 不一定等于问题 SQL,怎么判断是否真要优化?

执行次数高 ≠ 必须优化。比如一个 SELECT COUNT(*) FROM status WHERE type = 'active' 每秒跑 50 次,如果走索引且响应稳定在 0.5ms,它只是“忙”,不是“病”。

判断依据建议组合看三项:

  • calls(调用次数)是否显著高于其他语句(例如 Top 3 占总查询量 70%+)
  • avg_timemean_time 是否持续高于 P95 基线(比如多数查询
  • 对应表是否频繁出现在 SHOW ENGINE INNODB STATUSSEMAPHORESTRANSACTIONS 区域(暗示锁争用)

特别注意:缓存层(如 Redis)未覆盖的“高频 + 低变更”查询,往往比“低频 + 高耗时”的更值得加缓存——因为优化收益是乘数关系,不是加法。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

727

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1242

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

360

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

820

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

423

2024.04.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 812人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号