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

MySQL 定期分析、檢查、優化表維護操作手冊

     編輯:MySQL 資料庫相關知識

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 防誤操作

字段類型選型速查

場景推薦理由
固定長、高頻查詢CHARMyISAM 靜態表查詢快,無長度開銷
變長、節省空間VARCHARInnoDB 共享表空間,節省存儲
時間範圍 1970-2038、需時區TIMESTAMP4 字節,支援時區自動轉換
時間範圍 0000-9999DATETIME8 字節,範圍更大

其他實用技巧

  • AUTO_INCREMENT:用 UNSIGNED INT、必須有索引且 NOT NULL
  • 單表雙 TIMESTAMP 默認值不可行 → 改用觸發器或應用層賦值
  • 索引比表大仍有價值:索引有序,範圍掃描更快;優先排查索引設計是否冗餘
  • UPDATE tbl SET a=a+1 原子操作,避免「查出→改→寫回」並發丟失更新
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved