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