SHOW STATUS:伺服器健康儀表板
mysql> SHOW STATUS;
關鍵指標
| 變數 | 含義 | 異常判讀 |
| Aborted_connects | 嘗試連線失敗次數 | 暴增 → 攻擊/網路/認證配置錯誤 |
| Connections | 總連線嘗試次數 | 配合 Uptime 算 QPS |
| Max_used_connections | 歷史峰值併發連線 | 接近 max_connections → 需擴容 |
| Threads_connected | 當前開啟連線數 | 即時負載 |
| Slow_queries | 慢查詢計數 | 持續增長 → 需分析慢查詢日誌 |
| Innodb_buffer_pool_reads | Buffer Pool 未命中需讀磁碟 | 高 → 增加 innodb_buffer_pool_size |
| Innodb_row_lock_waits | 行鎖等待次數 | 高 → 熱點行爭用,優化索引/事務 |
SHOW 進階用法
SHOW PROCESSLIST; -- 當前執行緒,找長時間運行/鎖等待
SHOW ENGINE INNODB STATUS; -- InnoDB 內部狀態 (死鎖、鎖等待、Buffer Pool)
SHOW VARIABLES LIKE 'innodb%'; -- 確認參數生效
SHOW TABLE STATUS LIKE 'tbl'; -- 表統計 (行數、大小、索引長度、自增值)
EXPLAIN:執行計劃深度解析
EXPLAIN SELECT * FROM orders
JOIN customers ON orders.cust_id = customers.id
WHERE orders.status = 'paid';
關鍵欄位解讀
| 欄位 | 核心值 | 優化方向 |
| id | SELECT 識別號 | 衍生表/子查詢層級 |
| select_type | SIMPLE/PRIMARY/SUBQUERY/DERIVED/UNION | DERIVED/SUBQUERY 易產生臨時表 |
| table | 存取表名 | 關注驅動表順序 |
| type | system/const/eq_ref/ref/range/index/ALL | 避免 ALL (全表掃描),至少達到 range/ref |
| possible_keys | 可能用到的索引 | 為空 → 無索引可用 |
| key | 實際使用索引 | 與 possible_keys 差異大 → 統計資訊過期 |
| key_len | 使用索引長度 | 複合索引判斷用到幾欄 |
| ref | 關聯比較依據 | const/func/欄位名 |
| rows | 預估掃描行數 | 越小越好,配合 filtered 看過濾率 |
| filtered | 條件過濾後剩餘比例 | 低 → 索引選擇性差 |
| Extra | Using index/Using where/Using filesort/Using temporary | Using filesort/temporary 為優化重點 |
實戰優化案例:多表聯結優化
-- 原始:四表全關聯 (type=ALL, rows=45億)
EXPLAIN SELECT ... FROM tt, et, et et_1, do WHERE ...;
-- 問題:tt.ActualPC CHAR(10) vs et.EMPLOYID CHAR(15) 長度不符,索引失效
-- 解決:統一欄位長度 ALTER TABLE tt MODIFY ActualPC CHAR(15);
-- 或 ALTER TABLE et MODIFY EMPLOYID CHAR(10);
-- 優化後:type=ref, rows 大幅下降
統計資訊維護
ANALYZE TABLE tbl; -- 更新索引基數統計
OPTIMIZE TABLE tbl; -- 整理碎片 + 更新統計 (鎖表)
-- InnoDB 線上 DDL (5.6+) 可減少鎖定時間