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

MySQL MyISAM 靜態(固定長度)表特性:速度、快取、崩潰恢復、空間權衡

     編輯:MySQL 資料庫相關知識

MyISAM 三種儲存格式中,靜態格式為預設(無 VARCHAR/BLOB/TEXT 時)。本文解析固定長度列帶來的速度優勢、快取友善、崩潰恢復簡單、但佔較多空間的特性。

觸發條件

  • 表**不包含**變動長度欄位(VARCHAR、BLOB、TEXT)
  • 所有欄位為固定長度型別(CHAR、INT、DATE 等)

核心特性

特性說明
極快查詢第 N 列位移 = (N-1) × 列長,O(1) 直接定位,掃表也能精確計算每次讀取列數
快取友善固定大小易於記憶體對齊、預讀
崩潰恢復簡單myisamchk 易判斷列邊界,除寫入中斷的列外幾乎全恢復
重組需求低除非大量刪除需釋放空間,否則無需 OPTIMIZE TABLE
空間較大CHAR 會空格填充至定長,通常比動態格式佔更多磁碟

CHAR 欄位空格填充行為

CREATE TABLE t (c CHAR(10));
INSERT INTO t VALUES ('ab');  -- 實際儲存 'ab        ' (10 bytes)
SELECT c, LENGTH(c), CHAR_LENGTH(c) FROM t;
-- 結果:'ab        ', 10, 2

⚠️ 比較時尾端空格**會被忽略**('ab' = 'ab ' 為真),但 LIKE 不忽略。

格式轉換

  • 靜態 → 動態:ALTER TABLE t ROW_FORMAT=DYNAMIC(加入 VARCHAR/TEXT 也會自動轉換)
  • 動態 → 靜態:ALTER TABLE t ROW_FORMAT=FIXED(需無變長欄位)
  • 壓縮(唯讀):myisampack → ROW_FORMAT=COMPRESSED

適用場景判斷

  • ✅ 固定結構、高頻讀取、少更新、列數固定(如日誌、查碼表、配置表)
  • ✅ 需極致掃描/定位速度
  • ❌ 含長文本、變長欄位 → 自動變動態格式
  • ❌ 空間敏感、大量可變長資料 → 動態或壓縮格式

MyISAM 三格式快速比較

格式觸發條件速度空間恢復典型用途
靜態無變長欄位最快最大最簡單查碼表、固定結構日誌
動態有 VARCHAR/BLOB/TEXT中中需 myisamchk一般業務表
壓縮myisampack 產生快(唯讀)最小不可寫唯讀歸檔、CDN 靜態資料
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved