performance_schema
是 MySQL 用于性能监控和诊断的强大工具,它通过一系列视图和表提供了丰富的性能指标和事件数据,帮助深入理解 MySQL 的运行状况。下面是一些使用 performance_schema
进行性能分析的示例:
1. 检查是否启用 performance_schema
SHOW VARIABLES LIKE 'performance_schema';
这将显示 performance_schema
是否已启用(值为 ON
)。
2. 分析慢查询
通过 events_statements_summary_by_digest
视图可以查看慢查询的摘要信息:
SELECT DIGEST_TEXT, COUNT_STAR, SUM_TIMER_WAIT/1000000 AS Total_Time_Spent,
MIN_TIMER_WAIT/1000000 AS Min_Query_Time, AVG_TIMER_WAIT/1000000 AS Avg_Query_Time,
MAX_TIMER_WAIT/1000000 AS Max_Query_Time
FROM performance_schema.events_statements_summary_by_digest
WHERE SUM_TIMER_WAIT > 0
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
这个查询展示了耗时最长的10个查询摘要,包括查询文本、执行次数、总耗时、最小耗时、平均耗时和最大耗时。
3. 监控活动会话
要查看当前活跃的会话及其正在执行的SQL,可以查询 performance_schema.threads
和 performance_schema.events_statements_current
表:
SELECT th.processlist_id AS Id, th.user AS User, th.host AS Host,
th.db AS DB, th.command AS Command, th.state AS State,
es.sql_text AS Info
FROM performance_schema.threads th
JOIN performance_schema.events_statements_current es ON th.thread_id = es.thread_id
WHERE th.processlist_id > 0;
这将列出所有活动的线程,包括其ID、用户、主机、当前数据库、命令、状态以及正在执行的SQL语句。
4. 表锁分析
若要找出哪个线程持有表锁,可以查询 performance_schema.metadata_locks
视图:
SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, PROCESSLIST_ID, THREAD_OS_ID, SOURCE
FROM performance_schema.metadata_locks
WHERE OBJECT_TYPE = 'TABLE' AND LOCK_STATUS = 'LOCKED';
这会列出所有被锁定的表及其相关信息,包括锁的类型、持有锁的线程ID等。
5. 事件等待分析
分析系统等待事件可以帮助识别性能瓶颈,例如查询 events_waits_summary_global_by_event_name
可以看出最耗时的等待事件类型:
SELECT EVENT_NAME, COUNT_STAR, SUM_TIMER_WAIT/1000000 AS Total_Wait_Time_ms
FROM performance_schema.events_waits_summary_global_by_event_name
WHERE EVENT_NAME NOT LIKE 'wait/synch/%'
AND EVENT_NAME NOT LIKE 'wait/io/file/%'
ORDER BY Total_Wait_Time_ms DESC LIMIT 10;
这个查询排除了同步等待和文件I/O等待,专注于其他可能的性能瓶颈,如网络或内部处理等待。
注意
- 在执行上述查询前,请确保
performance_schema
已经启用,并根据你的MySQL版本和具体需求调整查询细节,因为不同版本的MySQL可能在performance_schema
的结构和视图上有细微差别。 - 分析性能数据时,应当结合具体的业务场景和负载特征来解读结果,以便更有效地定位和解决问题。