首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL sys Schema 官方手冊深度解讀:性能診斷利器的安裝、對象詳解與實戰用法

     編輯:MySQL 綜合教學

什麼是 sys Schema?

sys 是 MySQL 官方提供的診斷視圖庫,建立在 performance_schema 之上,將底層繁雜的性能數據聚合為人類可讀、開箱即用的視圖、存儲過程與函數。MySQL 5.7.7+ 內置,5.6 需手動安裝 (GitHub: mysql-sys)。

前提條件

  • MySQL 5.6+
  • performance_schema = ON (啟動參數,需重啟)
  • 權限:SELECT 於 sys 視圖/表,EXECUTE 於存儲過程/函數,INSERT/UPDATE 於 sys_config
  • 建議啟用的消費者與記錄點:
CALL sys.ps_setup_enable_instrument('wait');
CALL sys.ps_setup_enable_instrument('stage');
CALL sys.ps_setup_enable_instrument('statement');
CALL sys.ps_setup_enable_consumer('current');
CALL sys.ps_setup_enable_consumer('history_long');
-- 恢復默認配置
CALL sys.ps_setup_reset_to_default(TRUE);

核心對象分類總覽

1. 配置表與觸發器

對象說明
sys_configsys 運行時配置 (如語句截斷長度、診斷掃描開關)
sys_config_insert_set_user插入觸發器,記錄修改用戶
sys_config_update_set_user更新觸發器,記錄修改用戶

sys_config 關鍵配置項:

  • statement_truncate_len (默認 64):format_statement() 截斷長度
  • diagnostics.all_i_s_tables:diagnostics() 是否掃描 information_schema.tables
  • statement_performance_analyzer.limit (默認 100):分析報告最大行數

會話級覆蓋:SET @sys.statement_truncate_len = 32; 優先於表中值,SET @sys.xxx = NULL; 恢復默認。

2. 核心視圖 (按功能域分組)

域視圖 (不帶 x$ 為人類可讀單位,帶 x$ 為原始皮秒/字節)用途
主機維度host_summary / x$host_summary語句活動、文件 IO、連接數聚合
host_summary_by_file_io / x$...文件 IO 延遲、次數
host_summary_by_statement_latency / x$...語句延遲統計
host_summary_by_statement_type / x$...語句類型分佈
host_summary_by_stages / x$...階段事件耗時
用戶維度user_summary / x$user_summary用戶語句、IO、連接聚合
user_summary_by_file_io / x$...用戶文件 IO
user_summary_by_statement_latency / x$...用戶語句延遲
user_summary_by_statement_type / x$...用戶語句類型分佈
InnoDB 專項innodb_buffer_stats_by_schema / x$...Buffer Pool 按 Schema 佔用
innodb_buffer_stats_by_table / x$...Buffer Pool 按表佔用
innodb_lock_waits / x$innodb_lock_waits鎖等待詳情 (等待事務、持有事務、鎖模式、等待時長)
schema_table_statistics_with_buffer / x$...表統計 + Buffer Pool 信息
IO 分析io_global_by_file_by_latency / x$...全局文件 IO 延遲排序
io_by_thread_by_latency / x$...線程級 IO 消費
latest_file_io / x$...最近文件 IO 事件
內存分析memory_global_by_current_bytes / x$...全局內存分配類型佔用
memory_by_thread_by_current_bytes / x$...線程內存佔用
memory_global_total / x$...總內存佔用
Schema/表結構schema_object_overview各庫對象類型統計
schema_redundant_indexes冗余/重複索引檢測
schema_unused_indexes未使用索引檢測
語句分析statement_analysis / x$statement_analysis語句聚合統計 (執行次數、總延遲、平均延遲、掃描行、返回行)
statements_with_runtimes_in_95th_percentile / x$...平均延遲 TOP 5% 語句
statements_with_full_table_scans / x$...全表掃描語句
等待事件waits_global_by_latency / x$...全局等待事件總延遲排序
進程列表processlist / x$processlist、session / x$session增強版 SHOW PROCESSLIST,含進度報告 (MySQL 5.7.9+)
版本/指標version、metricssys/MySQL 版本、服務器關鍵指標聚合

3. 存儲過程 (運維自動化利器)

過程核心功能
diagnostics(interval, iterations, channel)全維度健康檢查報告,輸出到文件 (tee diag.out;)
statement_performance_analyzer()生成語句性能分析報告 (TOP SQL、全表掃描、臨時表、排序等)
ps_trace_thread(thread_id, ...)線程級性能跟蹤,輸出 JSON 格式事件堆棧
ps_trace_statement_digest(digest, ...)按 Digest 跟蹤語句所有性能儀器點
ps_setup_enable/disable_instrument/consumer/thread動態調整 P_S 儀器點/消費者/線程採集
ps_setup_save/reload_saved/reset_to_default配置備份/恢復/重置
create_synonym_db()創建同義詞庫 (視圖指向目標庫表)
table_exists(db, table)判斷表/視圖/臨時表是否存在
execute_prepared_stmt(sql)執行動態預備語句
ps_statement_avg_latency_histogram()語句平均延遲直方圖
ps_truncate_all_tables()清空所有 P_S 汇總表

4. 存儲函數 (格式化/解析/工具)

函數用途示例
format_bytes(bytes)字節 → 可讀單位format_bytes(1073741824) = '1.00 GiB'
format_time(picoseconds)皮秒 → 可讀時間format_time(1234567890123) = '1.23 s'
format_statement(text)SQL 截斷/格式化受 statement_truncate_len 控制
format_path(path)路徑符號化 (datadir → @datadir)format_path('/var/lib/mysql/db/t.ibd') = '@/db/t.ibd'
extract_schema_from_file_name(path)從文件路徑解析 Schema 名--
extract_table_from_file_name(path)從文件路徑解析表名--
ps_thread_id(conn_id)連接 ID → 線程 ID--
ps_thread_account(thread_id)線程 ID → 賬號 (user@host)--
ps_thread_stack(thread_id)線程事件堆棧 (JSON)--
ps_thread_trx_info(thread_id)線程事務信息 (JSON)--
quote_identifier(str)加反引號quote_identifier('a b') = '`a b`'
sys_get_config(var)讀取 sys_config 值--
version_major/minor/patch()解析 MySQL 版本號--
list_add/list_drop(csv, item)逗號分隔列表增刪--
ps_is_*_enabled()判斷賬號/消費者/儀器點/線程是否啟用返回 YES/NO

實戰場景速查

場景推薦視圖/過程關鍵指標
找出最耗資源的 SQLstatement_analysis、statements_with_runtimes_in_95th_percentileavg_latency, exec_count, rows_examined
定位鎖爭用innodb_lock_waitswait_age_secs, locked_table, waiting_trx_id
分析 IO 熱點文件io_global_by_file_by_latencylatency, count, bytes
檢查冗余/未用索引schema_redundant_indexes、schema_unused_indexesindex_name, reason
全庫健康巡檢報告CALL diagnostics(60, 10, 'current');輸出文件含版本、變量、InnoDB 狀態、進程列表、內存、P_S 狀態
線程級深度跟蹤CALL ps_trace_thread(conn_id, '/tmp/trace.json', 30, 0.1, TRUE);生成 JSON 含語句、階段、等待、鎖事件
動態調整採集範圍CALL ps_setup_enable_instrument('statement'); 等即時生效,無需重啟

導出與遷移

# mysqldump 導出 sys (需顯式指定)
mysqldump --databases --routines sys > sys_dump.sql
mysqlpump sys > sys_dump.sql

# 導入
mysql < sys_dump.sql

總結

  • sys 是 performance_schema 的「人類界面」,將底層儀器點數據轉化為可直接決策的視圖。
  • 善用 x$ 前綴視圖獲取原始數值 (皮秒、字節) 進行程序化分析;用無前綴視圖做人工排查。
  • diagnostics() 和 statement_performance_analyzer() 是「一鍵體檢」神器,建議納入日常巡檢腳本。
  • 動態調整 P_S 採集 (ps_setup_* 系列) 實現「按需採集」,平衡觀測深度與性能開銷。
  • MySQL 8.0 進一步增強了 sys (如 wait_classes_global_by_avg_latency 等新視圖),升級後請重新審視可用對象。

掌握 sys,讓性能優化從「大海撈針」變為「有的放矢」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved