Performance Schema是定位MySQL性能瓶颈的核心工具,通过分析等待事件、SQL语句摘要和资源竞争,可精准识别I/O、锁、高频率查询等深层次问题,实现从宏观到微观的性能优化。

利用MySQL性能模式(Performance Schema)来监控数据库瓶颈,在我看来,是深入了解MySQL内部运行机制、精准定位性能问题的最有效途径之一。它提供了一种前所未有的细粒度视角,让我们能够看到服务器内部到底在忙些什么、等待些什么,远超传统的慢查询日志或
SHOW STATUS
要真正摸清MySQL的脾气,Performance Schema是个不可多得的内窥镜。它的核心在于收集各种事件数据,包括等待事件(waits)、语句事件(statements)、阶段事件(stages)等,并将这些数据存储在
performance_schema
启用Performance Schema通常很简单,在
my.cnf
performance_schema = ON
我们的工作流程通常是这样的:
events_waits_summary_global_by_event_name
events_waits_summary_by_thread_by_event_name
events_statements_summary_by_digest
DIGEST
events_stages_summary_by_thread_by_event_name
events_stages_history_long
file_summary_by_event_name
table_io_waits_summary_by_table
mutex_summary_by_instance
通过这样的层层递进,我们就能从宏观到微观,逐步锁定数据库的性能瓶颈。
刚开始看Performance Schema的等待事件名称,简直像天书,比如
wait/io/file/innodb/innodb_data_file
wait/synch/mutex/innodb/buf_pool_mutex
performance_schema.events_waits_summary_global_by_event_name
这张表聚合了所有等待事件,我们可以通过
SUM_TIMER_WAIT
COUNT_STAR
举个例子,如果我看到
wait/io/file/sql/binlog
SUM_TIMER_WAIT
sync_binlog
SELECT
EVENT_NAME,
SUM_TIMER_WAIT / 1000000000000 AS total_wait_s, -- 转换为秒
COUNT_STAR AS event_count,
AVG_TIMER_WAIT / 1000000000 AS avg_wait_ms -- 转换为毫秒
FROM
performance_schema.events_waits_summary_global_by_event_name
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;如果
wait/lock/table/sql/handler
我发现很多时候,大家只关注执行时间长的语句,但Performance Schema能帮你看到那些执行很快但频率极高,累积起来却耗费大量资源的“隐形杀手”。
performance_schema.events_statements_summary_by_digest
这张表通过
DIGEST
SELECT * FROM users WHERE id = 1
SELECT * FROM users WHERE id = 2
DIGEST
我们可以关注以下几个关键指标:
SUM_TIMER_WAIT
COUNT_STAR
SUM_LOCK_TIME
SUM_ROWS_EXAMINED
SUM_ROWS_SENT
SELECT
DIGEST_TEXT,
SUM_TIMER_WAIT / 1000000000000 AS total_exec_s,
COUNT_STAR AS exec_count,
SUM_LOCK_TIME / 1000000000000 AS total_lock_s,
SUM_ROWS_EXAMINED AS total_rows_examined
FROM
performance_schema.events_statements_summary_by_digest
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;通过查询,如果我发现某个
UPDATE
COUNT_STAR
SUM_TIMER_WAIT
SUM_LOCK_TIME
更进一步,如果我想看某个具体
DIGEST
performance_schema.events_statements_history_long
当数据库性能出现瓶颈时,文件I/O和内存锁竞争往往是幕后黑手。Performance Schema提供了专门的视图来揭示这些低层次的细节。
文件I/O追踪:
performance_schema.file_summary_by_event_name
performance_schema.file_summary_by_instance
file_summary_by_event_name
file_summary_by_instance
-- 按事件类型查看文件I/O
SELECT
EVENT_NAME,
SUM_TIMER_WAIT / 1000000000000 AS total_io_s,
COUNT_STAR AS io_count,
SUM_NUMBER_OF_BYTES_READ AS bytes_read,
SUM_NUMBER_OF_BYTES_WRITE AS bytes_written
FROM
performance_schema.file_summary_by_event_name
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;
-- 按文件实例查看文件I/O
SELECT
FILE_NAME,
EVENT_NAME,
SUM_TIMER_WAIT / 1000000000000 AS total_io_s,
COUNT_STAR AS io_count
FROM
performance_schema.file_summary_by_instance
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;我记得有一次,我们的数据库I/O突然飙升,但业务流量并没有明显变化。通过
file_summary_by_instance
#sql_XXXX.MYD
内存锁竞争追踪:
对于内存锁(互斥量,mutex)和读写锁(rwlock)的竞争,我们可以查看
performance_schema.mutex_summary_by_instance
performance_schema.rwlock_summary_by_instance
-- 查看互斥量竞争
SELECT
OBJECT_INSTANCE_BEGIN,
EVENT_NAME,
SUM_TIMER_WAIT / 1000000000000 AS total_wait_s,
COUNT_STAR AS wait_count
FROM
performance_schema.mutex_summary_by_instance
ORDER BY
SUM_TIMER_WAIT DESC
LIMIT 10;高开销的内存锁竞争通常意味着MySQL内部的并发瓶颈。例如,如果
buf_pool_mutex
以上就是利用MySQL性能模式(Performance Schema)监控数据库瓶颈的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号