SHOW STATUS 是 MySQL 內建的「體檢儀」,暴露了 300+ 狀態變量,涵蓋連接、查詢、InnoDB 內部、複制、臨時表等維度。本文提出「三步診斷法」:全局掃描 → 核心計數聚焦 → 線程級深潛,並重點解讀 Com_* SQL 操作計數與 Innodb_rows_* 行級統計的實戰價值。
-- 會話級(當前連接) SHOW SESSION STATUS; -- 全局級(實例級累計,推薦) SHOW GLOBAL STATUS; -- 或查詢信息表 USE information_schema; SELECT * FROM GLOBAL_STATUS;
MySQL 5.6.21 返回 341 行參數。建議導出保存為基線,定期對比趨勢。
SHOW GLOBAL STATUS LIKE 'Com_%';
返回 142 個計數器,核心關注:
| 計數器 | 業務含義 | 異常信號 |
|---|---|---|
Com_select | SELECT 執行次數 | 突增可能為全表掃描風暴或緩存失效 |
Com_insert | INSERT 次數(批量算 1 次) | 與業務流量不符檢查導入腳本 |
Com_update | UPDATE 次數 | 高併發熱點行鎖競爭源頭 |
Com_delete | DELETE 次數 | 大量刪除產生碎片需 OPTIMIZE |
Com_commit / Com_rollback | 事務提交/回滾次數 | Rollback 比例 > 1% 需排查死鎖/業務異常 |
Com_replace | REPLACE 次數 | 隱性 DELETE+INSERT,主鍵衝突場景 |
mysql> SHOW GLOBAL STATUS LIKE 'Com_alter_table'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Com_alter_table | 0 | +-----------------+-------+ mysql> ALTER TABLE test ADD Name CHAR(10) NOT NULL; Query OK, 0 rows affected (0.02 sec) mysql> SHOW GLOBAL STATUS LIKE 'Com_alter_table'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | Com_alter_table | 1 | -- 計數 +1 +-----------------+-------+
SHOW GLOBAL STATUS LIKE 'Innodb_rows_%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Innodb_rows_read | 12345 | | Innodb_rows_inserted | 123 | | Innodb_rows_updated | 45 | | Innodb_rows_deleted | 12 | +----------------------+-------+
四大指標直接反映存儲引擎實際數據訪問量,對比 Com_* 可發現:
Com_select=100 但 Innodb_rows_read=1000000 → 平均每查詢掃描 1 萬行,存在全表掃描Com_update=50 但 Innodb_rows_updated=5000 → 單條 UPDATE 影響百行,可能缺少 WHERE 索引pt-query-digest、mysqldumpslowmysql> SHOW FULL PROCESSLIST; +----+------+-----------+------+---------+------+--------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------+------+---------+------+--------------------------+------------------+ | 15 | root | localhost | test | Query | 120 | Waiting for table lock | UPDATE t SET... | | 16 | app | 10.0.0.1 | prod | Sleep | 300 | | NULL | +----+------+-----------+------+---------+------+--------------------------+------------------+
核心欄位解讀:
Command:Sleep(空閒連接)、Query(執行中)、Connect(建連中)Time:已持續秒數,**長時間 Query + 非 Sleep 狀態 = 重點排查對象**State:Sending data、Copying to tmp table、Waiting for table lock、Locked、statistics 等,揭示執行階段Info:具體 SQL 文本(需 FULL 關鍵字顯示完整)mysqld_exporter + Grafana:指標級監控、趨勢圖、告警規則| 類別 | 核心指標 | 健康基線參考 |
|---|---|---|
| 連接 | Threads_connected, Threads_running, Connection_errors_* | Running < 80% max_connections;Errors = 0 |
| 查詢吞吐 | Questions, Queries, Com_select/insert/update/delete | 與業務流量匹配,無異常突變 |
| 緩存命中 | Qcache_hits, Qcache_inserts, Innodb_buffer_pool_read_requests, Innodb_buffer_pool_reads | Buffer Pool 命中率 > 99% |
| 臨時表 | Created_tmp_tables, Created_tmp_disk_tables | Disk/Total < 10%(超標優化 SQL/調大 tmp_table_size) |
| 排序 | Sort_scan, Sort_range, Sort_rows | Sort_scan 佔比低(利用索引排序) |
| InnoDB 核心 | Innodb_buffer_pool_wait_free, Innodb_log_waits, Innodb_row_lock_waits, Innodb_row_lock_time_avg | Waits = 0;Lock time avg < 10ms |
| 複制 | Slave_IO_Running, Slave_SQL_Running, Seconds_Behind_Master | Both YES;Delay < 1s |
SHOW GLOBAL STATUS 快照,構建「正常畫像」SHOW PROCESSLIST 定位具體線程 → EXPLAIN 分析執行計劃 → 代碼/索引優化MySQL 狀態變量是「數據庫說話」的語言,學會聽懂它,就掌握了效能診斷的主動權。