ANALYZE TABLE:更新索引統計資訊
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
- 適用:MyISAM, InnoDB, BDB
- 作用:掃描表更新「鍵值分布」,優化器據此選擇 JOIN 順序
- 加鎖:讀鎖
- 等效:
myisamchk -a
mysql> ANALYZE TABLE a;
+--------+---------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+---------+----------+-----------------------------+
| test.a | analyze | status | Table is already up to date |
+--------+---------+----------+-----------------------------+
CHECK TABLE:檢查錯誤與視圖有效性
CHECK TABLE tbl_name [, tbl_name] ... [QUICK|FAST|MEDIUM|EXTENDED|CHANGED]
- 適用:MyISAM, InnoDB,亦可檢查視圖依賴表是否存在
- 選項:
QUICK 僅檢查索引樹;EXTENDED 全行校驗
mysql> CHECK TABLE a_view\G
*************************** 3. row ***************************
Msg_type: error
Msg_text: Corrupt -- 依賴表被刪除導致視圖失效
OPTIMIZE TABLE:消除碎片、回收空間
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
- 適用:MyISAM, InnoDB, BDB
- 觸發場景:大量 DELETE/UPDATE 導致碎片、可變長列 (VARCHAR/BLOB/TEXT) 頻繁變更
- 頻率:週/月級,僅針對特定表
- InnoDB 注意:
OPTIMIZE 實際執行 RECREATE + ANALYZE,亦可用 ALTER TABLE tbl ENGINE=InnoDB 替代
SHOW TABLE STATUS:快速掌握表健康度
Rows:MyISAM 精確,InnoDB 估算 (誤差 ±50%)
- 精確行數請用
SELECT COUNT(*)
大批量刪除最佳實踐
- 必須加
LIMIT 分批,避免長事務鎖表、死鎖、Binlog 膨脹
- 無索引 WHERE 時:先
SELECT id FROM tbl WHERE ... LIMIT 1000,再按主鍵批次刪除
- 習慣性在 UPDATE/DELETE 後加
LIMIT 1 防誤操作
字段類型選型速查
| 場景 | 推薦 | 理由 |
| 固定長、高頻查詢 | CHAR | MyISAM 靜態表查詢快,無長度開銷 |
| 變長、節省空間 | VARCHAR | InnoDB 共享表空間,節省存儲 |
| 時間範圍 1970-2038、需時區 | TIMESTAMP | 4 字節,支援時區自動轉換 |
| 時間範圍 0000-9999 | DATETIME | 8 字節,範圍更大 |
其他實用技巧
AUTO_INCREMENT:用 UNSIGNED INT、必須有索引且 NOT NULL
- 單表雙
TIMESTAMP 默認值不可行 → 改用觸發器或應用層賦值
- 索引比表大仍有價值:索引有序,範圍掃描更快;優先排查索引設計是否冗餘
UPDATE tbl SET a=a+1 原子操作,避免「查出→改→寫回」並發丟失更新