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

MySQL 效能優化利器:SHOW STATUS、EXPLAIN 實戰與 OPTIMIZE TABLE 整理碎片

     編輯:MySQL 資料庫相關知識

優化不靠猜,靠工具。MySQL 內建 SHOW STATUS 看運行狀態、EXPLAIN 分析執行計畫、OPTIMIZE TABLE 整理碎片,三板斧解決 80% 效能問題。

一、SHOW STATUS:一窺服務器健康狀態

SHOW STATUS;

關鍵指標:

二、EXPLAIN:SQL 執行計畫 X 光機

實戰案例:四表聯結查詢優化全過程。

初始狀態:全表掃描災難

EXPLAIN SELECT ... 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;

結果:四表 type=ALL,預估掃描行數 74 × 2135 × 74 × 3872 ≈ 450 億行。

優化步驟 1:修正欄位長度不一致(CHAR(10) vs CHAR(15))

ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

結果:et 變 eq_ref,行數除以 74。

優化步驟 2:修正其餘關聯欄位長度

ALTER TABLE tt MODIFY AssignedPC VARCHAR(15), MODIFY ClientID VARCHAR(15);

結果:tt 變 ref,et_1/do 變 eq_ref,總行數大幅下降。

優化步驟 3:分析表統計資訊

myisamchk --analyze /path/to/tt
mysqladmin flush-tables

結果:優化器掌握真實資料分布,選擇最佳驅動表,最終 EXPLAIN 僅剩 tt 掃描 3872 行,其餘皆 eq_ref 1 行,查詢從「跑不完」變「毫秒級」。

EXPLAIN 關鍵欄位速查

變數含義異常判斷
Aborted_connects嘗試連線失敗數暴增可能遭暴力破解或網路抖動
Connections總連線嘗試數配合 Uptime 算 QPS
Max_used_connections歷史峰值併發接近 max_connections 需擴容
Threads_connected當前連線數突增檢查慢查詢或連線洩漏
Innodb_buffer_pool_reads緩衝池未命中讀磁碟次數高則需加大 innodb_buffer_pool_size
Created_tmp_disk_tables磁碟臨時表數高則需調 tmp_table_size 或優化 SQL
欄位重點值含義
typesystem/const/eq_ref/ref/range/index/ALL由好到壞,ALL=全表掃描
key實際用到的索引NULL 表示未用索引
rows預估掃描行數越小越好
ExtraUsing index/Using where/Using temporary/Using filesortUsing index=覆蓋索引佳;temporary/filesort 需優化

三、OPTIMIZE TABLE:整理碎片回收空間

OPTIMIZE TABLE tbl_name;
  • 適用:MyISAM、InnoDB、BDB 表。
  • 觸發場景:大量 DELETE、UPDATE 變長欄位後,產生碎片、空洞。
  • 原理:重建表 → 重排索引 → 更新統計資訊。
  • 線上操作:InnoDB 5.6+ 支援 Online DDL,鎖定時間極短。

工具鏈推薦

  • pt-query-digest(Percona Toolkit)分析慢查詢日誌。
  • MySQLTuner.pl 自動檢查配置與狀態給建議。
  • sys schema(5.7+ 內建)標準化效能視圖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved