MySQL分析执行次数最多的SQL的六种方法

 更新时间:2025年10月23日 08:57:46   作者:学亮编程手记  
这篇文章介绍了MySQL中分析执行次数最多的SQL的六种方法:使用慢查询日志、PerformanceSchema、SysSchema、通用日志(不推荐)、INFORMATION_SCHEMA.PROCESSLIST,以及pt-query-digest工具,文章建议根据具体需求组合使用这些方法,需要的朋友可以参考下

在MySQL中分析执行次数最多的SQL,主要有以下几种方法:

1. 使用MySQL慢查询日志

开启慢查询日志

-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';

-- 开启慢查询日志(需在my.cnf中配置持久化)
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;  -- 设置慢查询阈值(秒)
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

使用mysqldumpslow分析

# 分析执行次数最多的慢查询
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log

# 按执行时间排序
mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

2. 使用Performance Schema

开启Performance Schema

-- 检查是否开启
SHOW VARIABLES LIKE 'performance_schema';

-- 开启events_statements_history(如果未开启)
UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES' 
WHERE NAME LIKE 'events_statements_history%';

查询执行次数最多的SQL

SELECT 
    DIGEST_TEXT AS query,
    COUNT_STAR AS exec_count,
    AVG_TIMER_WAIT/1000000000000 AS avg_exec_time_sec,
    SUM_ROWS_EXAMINED AS rows_examined_sum,
    SUM_ROWS_SENT AS rows_sent_sum
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT IS NOT NULL
ORDER BY COUNT_STAR DESC
LIMIT 10;

3. 使用Sys Schema(MySQL 5.7+)

-- 查看执行次数最多的语句
SELECT * FROM sys.statements_with_full_table_scans 
ORDER BY exec_count DESC 
LIMIT 10;

-- 查看总执行次数最多的语句
SELECT * FROM sys.statement_analysis 
ORDER BY exec_count DESC 
LIMIT 10;

-- 查看执行次数多的标准化SQL
SELECT 
    query,
    db,
    exec_count,
    total_latency,
    avg_latency,
    rows_sent_avg,
    rows_examined_avg
FROM sys.x$statements_with_runtimes_in_95th_percentile
ORDER BY exec_count DESC
LIMIT 10;

4. 使用通用日志(不推荐生产环境)

-- 开启通用查询日志
SET GLOBAL general_log = 1;
SET GLOBAL general_log_file = '/var/log/mysql/general.log';

-- 分析日志(示例使用awk)
awk '
{
    if ($0 ~ /Query/) {
        # 提取SQL语句(简化版)
        query = substr($0, index($0, "Query:") + 7)
        queries[query]++
    }
}
END {
    for (q in queries) {
        print queries[q] " " q
    }
}' /var/log/mysql/general.log | sort -nr | head -10

5. 使用INFORMATION_SCHEMA.PROCESSLIST(实时监控)

-- 查看当前执行的SQL
SELECT 
    INFO AS query,
    COUNT(*) AS concurrent_count
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE COMMAND = 'Query' 
AND INFO IS NOT NULL
GROUP BY INFO
ORDER BY concurrent_count DESC
LIMIT 10;

6. 使用pt-query-digest工具

# 分析慢查询日志
pt-query-digest /var/log/mysql/slow.log

# 分析tcpdump抓取的流量
tcpdump -i any -s 65535 -x -nn -q -tttt port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt

# 分析general log
pt-query-digest --type genlog /var/log/mysql/general.log

推荐的生产环境方案

对于生产环境,建议组合使用:

  1. 长期监控:Performance Schema + Sys Schema
  2. 性能分析:慢查询日志 + pt-query-digest
  3. 实时监控:INFORMATION_SCHEMA.PROCESSLIST

完整的Performance Schema监控示例

-- 开启必要的监控项
UPDATE performance_schema.setup_instruments 
SET ENABLED = 'YES', TIMED = 'YES' 
WHERE NAME LIKE 'statement/%';

UPDATE performance_schema.setup_consumers 
SET ENABLED = 'YES' 
WHERE NAME LIKE '%statements%';

-- 定期查询TOP SQL(可做成定时任务)
SELECT 
    SCHEMA_NAME as db,
    DIGEST_TEXT as query,
    COUNT_STAR as exec_count,
    ROUND(SUM_TIMER_WAIT/1000000000000, 2) as total_time_sec,
    ROUND(AVG_TIMER_WAIT/1000000000000, 4) as avg_time_sec,
    SUM_ROWS_EXAMINED as rows_examined,
    SUM_ROWS_SENT as rows_sent,
    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
ORDER BY COUNT_STAR DESC
LIMIT 20;

选择哪种方法取决于你的具体需求:实时监控用Performance Schema,深度分析用慢查询日志,快速排查用Sys Schema。

以上就是MySQL分析执行次数最多的SQL的六种方法的详细内容,更多关于MySQL执行次数最多的SQL的资料请关注脚本之家其它相关文章!

相关文章

  • MySQL复制与主从架构(Master-Slave)详细介绍

    MySQL复制与主从架构(Master-Slave)详细介绍

    数据库的主从架构是通过将数据从一个主库复制到一个或多个从库来实现,该架构的核心是数据同步,主要用于数据的容灾备份,读写分离,数据分析场景中,这篇文章主要介绍了MySQL复制与主从架构(Master-Slave)的相关资料,需要的朋友可以参考下
    2026-04-04
  • 一文详解MySQL主从同步原理

    一文详解MySQL主从同步原理

    这篇文章主要介绍了一文详解MySQL主从同步原理,MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句,更多相关内容介绍感兴趣的小伙伴可以参考一下
    2022-08-08
  • Express连接MySQL及数据库连接池技术实例

    Express连接MySQL及数据库连接池技术实例

    数据库连接池是程序启动时建立足够数量的数据库连接对象,并将这些连接对象组成一个池,由程序动态地对池中的连接对象进行申请、使用和释放,本文重点给大家介绍Express连接MySQL及数据库连接池技术,感兴趣的朋友一起看看吧
    2022-02-02
  • MySQL各种 JOIN 的特点及应用场景分析

    MySQL各种 JOIN 的特点及应用场景分析

    MySQL中的JOIN操作用于将多个表中的数据关联起来,常见的JOIN 类型包括INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN(MySQL 不直接支持 FULL JOIN,但可通过 UNION 实现),本文介绍MySQL各种 JOIN 的特点及应用场景,感兴趣的朋友一起看看吧
    2025-12-12
  • MySql获取当前时间并转换成字符串的实现

    MySql获取当前时间并转换成字符串的实现

    本文主要介绍了MySql获取当前时间并转换成字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • MySQL8.0无法启动3534的解决方法

    MySQL8.0无法启动3534的解决方法

    本文主要是记录一下自己使用MySQL的一次踩坑经历,我的MySQL安装好后,使用一周后的同一时间必定报连接失败,然后查找发现是MySQL本地服务没有启动,下面就详细的介绍一下
    2021-06-06
  • MySQL 编码机制

    MySQL 编码机制

    一般在MYSQL使用中文查询 都是用 set NAMES character
    2008-12-12
  • MySQL事务的四大特性以及并发事务问题解读

    MySQL事务的四大特性以及并发事务问题解读

    这篇文章主要介绍了MySQL事务的四大特性以及并发事务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • MySQL千万级大数据SQL查询优化知识点总结

    MySQL千万级大数据SQL查询优化知识点总结

    在本篇文章里小编给大家整理的是一篇关于MySQL千万级大数据SQL查询优化知识点总结内容,有需要的朋友们可以学习参考下。
    2019-12-12
  • mysql myisam 优化设置设置

    mysql myisam 优化设置设置

    mysql myisam 优化设置设置,需要的朋友可以参考下。
    2010-03-03

最新评论