首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL內建工具性能優化實戰:SHOW STATUS 與 EXPLAIN 深度應用

     編輯:MySQL 資料庫相關知識

SHOW STATUS:服務器健康儀表盤

mysql> SHOW GLOBAL STATUS;

核心指標解讀:

變量含義異常閾值建議
Aborted_connects 嘗試連接失敗次數 > 0 秒級告警,排查網絡/認證/防火牆
Connections 歷史總連接嘗試數 配合 Uptime 計算 QPS 基線
Max_used_connections 歷史峰值並發連接數 接近 max_connections 80% 須擴容
Threads_connected 當前活躍連接數 實時負載指標
Slow_queries 慢查詢累計數 持續增長需配合慢日志分析
Innodb_buffer_pool_reads InnoDB 物理讀頁次數 / Innodb_buffer_pool_read_requests > 1% 緩存不足
Innodb_log_waits Redo Log 寫入等待次數 > 0 表示日志文件過小/刷盤慢
Table_open_cache_misses 表緩存未命中次數 持續增長調大 table_open_cache

SHOW 族命令全景

SHOW ENGINE INNODB STATUS;    -- InnoDB 內部狀態 (鎖/事務/緩存/清理)
SHOW PROCESSLIST;             -- 當前線程活動 (配合 SHOW FULL PROCESSLIST)
SHOW VARIABLES LIKE 'pat';    -- 參數值查詢
SHOW INDEX FROM tbl;          -- 索引詳情
SHOW TABLE STATUS LIKE 'tbl'; -- 表統計信息 (行數/大小/自增值)
SHOW GRANTS FOR 'user'@'%';   -- 權限審計

EXPLAIN:執行計劃 X 光機

僅支持 SELECT,但 UPDATE/DELETE 可轉換為等效 SELECT 分析。

核心輸出欄位解讀

欄位關鍵值含義
type system/const/eq_ref/ref/range/index/ALL 訪問類型,從優到劣,**避免 ALL (全表掃描)**
possible_keys 索引列表 優化器理論可用索引
key 實際使用索引 NULL 表示無索引可用
key_len 字節數 驗證複合索引最左前綴使用長度
ref 常數/列名 與索引比較的值來源
rows 預估掃描行數 越小越好,誤差大時 ANALYZE TABLE
Extra Using index/where/filesort/temporary Using filesort/temporary 為優化重點

實戰優化案例:四表連接從 450 億行掃描到毫秒級

初始 SQL 與表結構

EXPLAIN SELECT tt.ticketnumber, ..., et.country, et_1.country, do.custname
FROM tt, et, et AS et_1, do
WHERE tt.submittime IS NULL
  AND tt.actualpc = et.employid
  AND tt.assignedpc = et_1.employid
  AND tt.clientid = do.custnmbr;

-- 表定義關鍵列
tt.actualpc     CHAR(10)   -- 有索引
tt.assignedpc   CHAR(10)   -- 有索引
tt.clientid     CHAR(10)   -- 有索引
et.employid     CHAR(15) PK
do.custnmbr     CHAR(15) PK

優化步驟演進

  1. 列長度對齊:ALTER TABLE tt MODIFY actualpc VARCHAR(15), MODIFY assignedpc VARCHAR(15), MODIFY clientid VARCHAR(15); 消除 CHAR(10) vs CHAR(15) 隱式轉換導致索引失效,type 從 ALL 變 eq_ref,行數乘積除以 74。
  2. 統計信息修正:myisamchk --analyze /path/tt; mysqladmin refresh; 修正優化器對 分布誤判 (非均勻),最終計劃穩定在 eq_ref 鏈路。

最終優化計劃

+-------+--------+-----------------------------+---------+---------+-------------------+------+------------+
| table | type   | possible_keys               | key     | key_len | ref               | rows | Extra      |
+-------+--------+-----------------------------+---------+---------+-------------------+------+------------+
| tt    | ALL    | assignedpc,clientid,actualpc| NULL    | NULL    | NULL              | 3872 | where used |
| et    | eq_ref | PRIMARY                     | PRIMARY | 15      | db.tt.actualpc    | 1    |            |
| et_1  | eq_ref | PRIMARY                     | PRIMARY | 15      | db.tt.assignedpc  | 1    |            |
| do    | eq_ref | PRIMARY                     | PRIMARY | 15      | db.tt.clientid    | 1    |            |
+-------+--------+-----------------------------+---------+---------+-------------------+------+------------+

驅動表 tt 全表掃描 3872 行 (接受),其餘三表主鍵點查 eq_ref,**總掃描行數從 452 億降至 3872**,性能提升 7 個數量級。

OPTIMIZE TABLE:碎片整理與空間回收

  • 適用:MyISAM / InnoDB (含 BLOB/TEXT 頻繁更新/刪除的表)
  • 操作:OPTIMIZE TABLE tbl_name; (實際執行 ALTER TABLE ... ENGINE=InnoDB 重建)
  • 效果:回收碎片空間、重建索引統計信息、壓縮數據頁
  • 注意:鎖表重建,大表需 pt-online-schema-change 或維護窗口執行

持續優化閉環

  1. SHOW GLOBAL STATUS 定期採集建立基線
  2. pt-query-digest 分析慢查詢 TOP 10
  3. EXPLAIN 逐個擊破執行計劃缺陷
  4. 變更驗證:對比修改前後 rows/Extra/耗時
  5. 固化參數至 my.cnf,納入變更管理
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved