摘要:MySQL 的 performance_schema 主要基于内存存储,其设计目标是提供低开销、实时的服务器运行状态监控,因此核心数据结构和绝大多数表的数据都存储在内存中,而非磁盘文件。
MySQL 的 performance_schema 主要基于内存存储,其设计目标是提供低开销、实时的服务器运行状态监控,因此核心数据结构和绝大多数表的数据都存储在内存中,而非磁盘文件。
performance_schema 包含多种功能的表,虽然都基于内存,但数据来源和生命周期略有差异,可分为两类:
表类型数据内容内存存储特点示例表动态事件表
实时监控数据(语句执行、锁等待、连接等)
采用环形缓冲区(Circular Buffer),数据满后自动覆盖旧数据,无持久化。
events_statements_history、events_waits_current、mutex_instances
静态配置 / 元数据表
监控规则、消费者、工具等配置信息
内存中存储配置,初始值来自 MySQL 默认配置或 my.cnf,修改后即时生效(重启后需重新配置,除非写入 my.cnf)。
setup_consumers、setup_instruments、performance_timers
存储策略:该表采用环形缓冲区(Circular Buffer)机制,当数据量达到预设上限时,新数据会覆盖最旧的数据。假设:
performance_schema_events_statements_history_long_size = 10,000(默认)。服务器每秒执行 100 条语句。所有线程均匀生成事件。则:
理论保存时长 = 总容量 / 每秒新增事件数 = 10,000 / 100 = 100 秒 ≈ 1.7 分钟。实际中,若某些线程生成事件更频繁,可能导致其他线程的旧数据被更快覆盖。-- 查看每个线程的 history 配置SHOW VARIABLES LIKE 'performance_schema_events_statements_history_size';-- 查看全局 history_long 配置SHOW VARIABLES LIKE 'performance_schema_events_statements_history_long_size';主要用途:分析近期执行的语句,定位慢查询或异常操作。结合 TIMER_WAIT(执行时间,皮秒单位)和 lock_TIME(锁等待时间)优化 SQL 性能。局限性:不适合长期存储,如需保留历史数据,需定期导出到外部存储。无法直接通过时间戳筛选数据(TIMER_START 和 TIMER_END 是服务器启动后的相对时间)。以下是一个针对 MySQL 8.0 中慢 SQL 情况的统计分析 SQL,基于 performance_schema 表:
-- 慢SQL统计分析:按平均执行时间排序,展示关键性能指标SELECT-- SQL语句的唯一标识和摘要digest,digest_text AS sql_text,-- 执行次数统计count_star AS total_executions,-- 执行时间统计(单位:秒)ROUND(sum_timer_wait / 1000000000000, 3) AS total_exec_time_sec,ROUND(avg_timer_wait / 1000000000000, 3) AS avg_exec_time_sec,ROUND(max_timer_wait / 1000000000000, 3) AS max_exec_time_sec,-- 锁等待时间统计(单位:秒)ROUND(sum_lock_time / 1000000000000, 3) AS total_lock_time_sec,-- _rows统计sum_rows_sent AS total_rows_sent,sum_rows_examined AS total_rows_examined,sum_rows_affected AS total_rows_affected,-- 全表扫描情况sum_no_index_used AS total_full_scan,sum_no_good_index_used AS total_no_good_index,-- 最后执行时间last_seen AS last_execution_timeFROMperformance_schema.events_statements_summary_by_digestWHERE-- 筛选出平均执行时间超过1秒的SQL(可根据需要调整阈值)avg_timer_wait > 1000000000000-- 排除空语句AND digest_text IS NOT NULL-- 排除系统库SQLAND schema_name NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys')-- 按平均执行时间降序排列,优先查看最慢的SQLORDER BYavg_exec_time_sec DESCLIMIT 50;如果需要更详细的历史执行记录,可以结合 events_statements_history_long 表进行分析,获取具体的执行实例信息。
events_statements_history 的保存时间取决于配置的最大行数和语句生成频率。若需延长保存时间,可通过调整参数增加容量,但需权衡内存开销。对于长期监控,建议结合外部工具(如 pt-query-digest)或定期归档数据。
来源:晓霞看科技