SHOW STATUS / SHOW VARIABLES
mysql> SHOW STATUS;
-- 關鍵指標:
Aborted_connects -- 連線失敗計數
Connections -- 嘗試連線總數
Max_used_connections -- 歷史峰值並發
Threads_connected -- 當前連線數
Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests -- 緩衝池命中率
配合 SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size' 評估記憶體配置是否足夠。
EXPLAIN 實戰優化案例
原始 SQL(四表關聯)
EXPLAIN SELECT tt.ticketnumber, tt.timein, ..., 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) | idx_actualpc |
| tt | assignedpc | char(10) | idx_assignedpc |
| tt | clientid | char(10) | idx_clientid |
| et | employid | char(15) | PRIMARY |
| do | custnmbr | char(15) | PRIMARY |
優化步驟
- 修正欄位長度不一致:
tt.actualpc char(10) vs et.employid char(15) → ALTER TABLE tt MODIFY actualpc VARCHAR(15)。
同理修正 assignedpc、clientid 為 VARCHAR(15)。
- 執行 ANALYZE TABLE 更新統計資訊:
myisamchk --analyze /path/to/tt.MYI → mysqladmin refresh。
優化前後 EXPLAIN 對比
| 階段 | type | rows 總乘積 | 備註 |
| 原始 | ALL (全表掃描) | 45,268,558,720 | 四表全掃描 |
| 修正長度後 | et: eq_ref, tt: ref... | ~3872 * 74 * 74 | 消除一個全掃描 |
| ANALYZE 後 | tt: ALL (where used), 其他 eq_ref | 3872 | 優化器掌握數值分布,選擇最佳駕駛表 |
OPTIMIZE TABLE
- 適用:
MyISAM、InnoDB(實際執行 ALTER TABLE ... ENGINE=InnoDB 重建)。
- 時機:大量
DELETE/UPDATE 變長欄位後,碎片率高。
- 指令:
OPTIMIZE TABLE tbl_name;(會鎖表,建議低峰期執行)。
工具箱總結
SHOW STATUS:宏觀健康度。
EXPLAIN:單條 SQL 執行計畫微觀分析。
OPTIMIZE TABLE:物理儲存整理。
- 搭配
slow_query_log、pt-query-digest 持續優化。