MySQL 服務層運行時的底層效能監控框架。不同於 INFORMATION_SCHEMA 關注元數據,PS 專注效能數據:等待事件、階段、語句、事務、鎖、內存、復制等微觀指標。資料儲於 performance_schema 資料庫 (Memory 引擎,非持久化),支援動態配置、SQL 查詢分析。
-- my.cnf 永久啟用
[mysqld]
performance_schema = ON
-- 運行時檢查
SHOW VARIABLES LIKE 'performance_schema'; -- ON 表示啟用成功
-- 檢查引擎支援
SHOW ENGINES; -- PERFORMANCE_SCHEMA 行 Support = YES
wait/io/file/innodb/innodb_data_file。setup_instruments 控制啟用/計時。setup_consumers 控制啟用。WHERE 條件。| 表名 | 用途 | 關鍵欄位 |
|---|---|---|
| setup_instruments | 哪些記錄點啟用/計時 | NAME, ENABLED, TIMED |
| setup_consumers | 哪些消費者啟用 (層級依賴) | NAME, ENABLED |
| setup_objects | 監控哪些資料庫/表/程序對象 | OBJECT_TYPE, OBJECT_SCHEMA, OBJECT_NAME, ENABLED, TIMED |
| setup_actors | 背景線程初始監控狀態 | HOST, USER, ROLE, ENABLED, HISTORY |
| setup_timers | 各類事件使用的計時器 | NAME (idle/wait/stage/statement/transaction), TIMER_NAME |
global_instrumentation (總開關) →thread_instrumentation (線程級) →events_xxx_current (當前事件) →events_xxx_history / events_xxx_history_long (歷史)上層關閉,下層不再被檢查/生成事件。
file_instances:開啟的檔案 IO 對象。mutex_instances / rwlock_instances / cond_instances:同步原語實例 (含持有者線程 ID)。socket_instances:實時連線快照 (IP、Port、State=ACTIVE/IDLE)。events_waits_current:每線程當前正在等待什麼 (鎖、IO、網路)。events_waits_history:每線程最近 N 次等待 (預設 10)。events_waits_history_long:全局最近 N 次等待 (預設 10000)。分子事件特性: 表 IO 等待 (wait/io/table/sql/handler) 會嵌套檔案 IO 等待,current 表中會同時出現兩行 (外層 TABLE IO、內層 FILE IO)。
stage/sql/Sorting result, stage/sql/Copying to tmp table 等。5.7.5+ 提供 WORK_COMPLETED/WORK_ESTIMATED 進度百分比。DIGEST_TEXT (標準化 SQL) 與 DIGEST (MD5)。支援 events_statements_summary_by_digest 發現高頻/慢查詢模式。events_waits_summary_global_by_event_name (排序 COUNT_STAR 或 SUM_TIMER_WAIT 找熱點)。events_xxx_summary_by_thread_by_event_name 等。?,移除註釋、調整空格。SELECT * FROM t WHERE id=1 → SELECT * FROM t WHERE id = ?。DIGEST_TEXT (標準化文本) + DIGEST (MD5 Hash)。performance_schema_max_digest_length (預設 1024B) 控制標準化長度。events_statements_summary_by_digest 表提供:執行次數、總延遲、平均延遲、掃描行數、臨時表/磁盤表創建次數等關鍵指標。UPDATE setup_instruments SET ENABLED=YES, TIMED=YES; UPDATE setup_consumers SET ENABLED=YES;)。events_waits_summary_global_by_event_name 找 SUM_TIMER_WAIT 最高的等待類型 (如 wait/synch/mutex/... 鎖熱點)。wait/io/file/%) 降低干擾。SELECT * FROM events_waits_current WHERE THREAD_ID = ? 看等待什麼鎖 (OBJECT_INSTANCE_BEGIN)。SELECT * FROM mutex_instances WHERE OBJECT_INSTANCE_BEGIN = ? 獲取 LOCKED_BY_THREAD_ID。SELECT * FROM events_waits_current WHERE THREAD_ID = holder_id。MySQL 5.7.6+ 將系統/狀態變數表遷移至 PS:
performance_schema.global_variables / session_variables / variables_by_threadperformance_schema.global_status / session_status / status_by_thread/account/host/usershow_compatibility_56=ON 兼容模式下 SHOW VARIABLES/STATUS 仍查 INFORMATION_SCHEMA 並警告;關閉後直接查 PS 表並要求 SELECT 權限。未來版本將移除 INFORMATION_SCHEMA 相關表與兼容參數。
-1 (預設) 表示自動:啟動不分配,按需增長,無上限 (受限於系統記憶體)。設為 0 禁用該類收集。設為 N>0 固定上限,超限丟棄事件並增加 _lost 狀態計數。SELECT * FROM memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';