如何实现对MySQL执行的查询分析、统计和监控

来源:站长论坛作者:小雨头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何实现对MySQL执行的查询分析、统计和监控》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何实现对MySQL执行的查询分析、统计和监控》有用,将其分享出去将是对创作者最好的鼓励。

MySQL的查询分析、统计和监控是数据库运维和性能优化的核心工作,通过合理采集和分析查询执行数据,可以快速定位性能瓶颈,优化系统整体响应速度。

如何实现对MySQL执行的查询分析、统计和监控

MySQL自带的查询监控基础能力

慢查询日志配置与使用

慢查询日志是MySQL原生提供的查询监控功能,用于记录执行时间超过指定阈值的SQL语句,是分析低效查询的核心依据。首先需要开启慢查询日志并配置相关参数:

-- 查看慢查询日志相关配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 开启慢查询日志,1表示开启,0表示关闭
SET GLOBAL slow_query_log = 1;
-- 设置慢查询阈值,单位秒,这里设置为2秒,执行超过2秒的查询会被记录
SET GLOBAL long_query_time = 2;
-- 设置慢查询日志存储路径,注意路径需要有MySQL进程写入权限
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

慢查询日志开启后,所有符合阈值的查询都会被记录到指定文件中,日志内容包含查询执行时间、锁等待时间、返回行数、具体SQL语句等信息。可以通过mysqldumpslow工具对慢查询日志进行初步分析:

# 统计慢查询日志中出现次数最多的10条SQL
mysqldumpslow -s c -t 10 /var/log/mysql/slow.log
# 按照查询执行时间排序,输出最慢的5条SQL
mysqldumpslow -s t -t 5 /var/log/mysql/slow.log

性能字典表的查询统计

MySQL的performance_schema库提供了丰富的性能监控字典表,其中events_statements_summary_by_digest表可以统计所有执行过的SQL的摘要信息,包括执行次数、总执行时间、平均执行时间等,无需开启慢查询日志即可获取全量查询的统计结果:

-- 查询执行次数最多的前10条SQL
SELECT 
    DIGEST_TEXT AS sql摘要,
    COUNT_STAR AS 执行次数,
    SUM_TIMER_WAIT/1000000000000 AS 总执行时间_秒,
    AVG_TIMER_WAIT/1000000000000 AS 平均执行时间_秒,
    SUM_ROWS_EXAMINED AS 总扫描行数,
    SUM_ROWS_SENT AS 总返回行数
FROM performance_schema.events_statements_summary_by_digest
ORDER BY COUNT_STAR DESC
LIMIT 10;

自定义查询统计与监控实现

定时采集统计脚本

我们可以编写定时脚本,定期从performance_schema相关表中采集查询数据,存储到自定义的统计表中,方便后续做趋势分析和阈值告警。首先创建自定义统计表:

CREATE TABLE IF NOT EXISTS mysql_query_stat (
    id INT PRIMARY KEY AUTO_INCREMENT,
    digest_text VARCHAR(1024) COMMENT 'SQL摘要',
    exec_count INT COMMENT '执行次数',
    total_exec_time DECIMAL(20,6) COMMENT '总执行时间,秒',
    avg_exec_time DECIMAL(20,6) COMMENT '平均执行时间,秒',
    total_scan_rows BIGINT COMMENT '总扫描行数',
    total_return_rows BIGINT COMMENT '总返回行数',
    stat_time DATETIME COMMENT '统计时间',
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='MySQL查询统计表';

然后编写Python脚本定时采集数据并插入统计表:

import pymysql
import datetime

# 数据库连接配置
db_config = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'password': 'your_password',
    'db': 'monitor_db',
    'charset': 'utf8mb4'
}

def collect_query_stat():
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    # 查询performance_schema中的查询统计信息
    query_sql = """
        SELECT 
            DIGEST_TEXT,
            COUNT_STAR,
            SUM_TIMER_WAIT/1000000000000,
            AVG_TIMER_WAIT/1000000000000,
            SUM_ROWS_EXAMINED,
            SUM_ROWS_SENT
        FROM performance_schema.events_statements_summary_by_digest
        WHERE COUNT_STAR > 0
    """
    cursor.execute(query_sql)
    results = cursor.fetchall()
    now = datetime.datetime.now()
    # 插入自定义统计表
    insert_sql = """
        INSERT INTO mysql_query_stat 
        (digest_text, exec_count, total_exec_time, avg_exec_time, total_scan_rows, total_return_rows, stat_time)
        VALUES (%s, %s, %s, %s, %s, %s, %s)
    """
    cursor.executemany(insert_sql, [(item[0], item[1], item[2], item[3], item[4], item[5], now) for item in results])
    conn.commit()
    cursor.close()
    conn.close()

if __name__ == '__main__':
    collect_query_stat()

可以将该脚本配置为每分钟执行一次,通过Linux的crontab或者Windows的任务计划程序实现定时采集。

核心监控指标说明

实现MySQL查询监控时,需要重点关注以下核心指标:

  • 慢查询数量:单位时间内执行时间超过阈值的查询数量,反映数据库整体查询性能
  • 高频查询执行次数:执行次数最多的SQL语句,优先优化高频低效的查询
  • 平均查询执行时间:所有查询的平均执行耗时,判断数据库响应速度是否符合预期
  • 查询扫描行数与返回行数比值:比值过高说明查询可能缺少合适索引,需要优化
  • 查询错误率:执行失败的查询占比,反映SQL语句的合法性和数据库运行状态

监控告警配置示例

当采集到查询统计信息后,可以设置告警规则,当指标超过阈值时发送通知。例如当慢查询数量每分钟超过10条时触发告警:

def check_slow_query_alert():
    conn = pymysql.connect(**db_config)
    cursor = conn.cursor()
    # 查询最近1分钟的慢查询数量,假设慢查询执行时间阈值为2秒
    alert_sql = """
        SELECT COUNT(*) 
        FROM mysql_query_stat 
        WHERE stat_time >= DATE_SUB(NOW(), INTERVAL 1 MINUTE)
        AND avg_exec_time > 2
    """
    cursor.execute(alert_sql)
    slow_count = cursor.fetchone()[0]
    if slow_count > 10:
        # 这里可以替换为发送邮件、企业微信通知等告警逻辑
        print(f'告警:最近1分钟慢查询数量达到{slow_count}条,超过阈值10条')
    cursor.close()
    conn.close()

通过上述方法,就可以完整实现MySQL的查询分析、统计和监控能力,根据业务需求调整采集频率和告警阈值,即可搭建适配自身场景的监控体系。

MySQL查询分析查询统计数据库监控slow_query_log修改时间:2026-06-12 21:33:46

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。