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

MyISAM 儲存引擎架構詳解(一):檔案結構、跨平台性、動靜態行格式、指針大小與 MAX_ROWS 實測

     編輯:MySQL 資料庫相關知識

MyISAM 是 MySQL 5.5 前的預設引擎,以「高讀取效能、全文索引、壓縮表、GIS 函數」著稱,但**不支援事務、行鎖、外鍵**。本篇深入其底層儲存架構:雙檔案結構、跨平台性、行格式判定、指針大小與容量上限配置實測。

雙檔案儲存結構

  • .frm:表定義(結構元數據),所有引擎通用。
  • .MYD (MYData):**資料檔**,順序儲存行資料。
  • .MYI (MYIndex):**索引檔**,B+ 樹結構儲存所有索引(含主鍵)。

跨平台性:檔案格式與位元組序無關,**可直接複製 .MYD/.MYI/.frm 到不同 OS/CPU 架構**(如 Linux x64 → Windows x86),FLUSH TABLES 後即可掛載使用,極利於異構遷移與備份。

行格式:動態 vs 靜態(MySQL 自動判定)

格式觸發條件特徵優/缺點
靜態無 VARCHAR/BLOB/TEXT 等變長列固定行長,位移計算極快,易修復空間浪費(CHAR 佔滿定長)、不支援變長列
動態含任一變長列行頭記錄長度+偏移,支援變長、空間緊湊碎片化需 OPTIMIZE TABLE、修復較複雜

MySQL 5.0+ 預設傾向動態行格式(ROW_FORMAT=DYNAMIC),可用 ROW_FORMAT=FIXED 強制靜態。

指針大小決定容量上限:4/6/8 字節三檔位

  • 4 字節:早期預設,最大 4GB 資料檔(MAX_ROWS 未指定時)。
  • 6 字節:MySQL 5.0+ 預設,最大 256TB(2^48 行位移)。
  • 8 字節:所有版本支援上限,理論 64EB,需顯式指定大 MAX_ROWS。

控制參數:MAX_ROWS(預估最大行數)、AVG_ROW_LENGTH(預估平均行長)。MySQL 据此自動選擇指針大小:MAX_ROWS * AVG_ROW_LENGTH > 4GB → 6 字節;> 256TB → 8 字節。

實測驗證:建表指定 10 億行 × 32 字節 → 91GB 容量

CREATE TABLE mytable (
    a INT NOT NULL PRIMARY KEY,
    b CHAR(18) NOT NULL
) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;

SHOW TABLE STATUS LIKE 'mytable'\G
-- Max_data_length: 98784247807 (~91GB)
-- Create_options: max_rows=1000000000 avg_row_length=32

驗證:MySQL 實際分配接近 91GB 容量上限,指針大小自動升級為 6 字節。

修改指針大小 = 重建全表(慎用)

ALTER TABLE mytable MAX_ROWS=2000000000 AVG_ROW_LENGTH=32;
-- 觸發全表複製、索引重建,大表耗時極長、鎖表、需雙倍空間

建議:**規劃階段一次設對**,避免後續 ALTER。

MyISAM 核心限制速查

  • ❌ 無事務(ACID)、無行鎖、無外鍵、無崩潰安全恢復(依賴修復工具)。
  • ✅ 全文索引(5.6 前 InnoDB 無)、壓縮表 (myisampack)、GIS 空間索引、跨平台檔案複製、極快 COUNT(*)(無 WHERE 時直接讀表元數據)。

適用場景速查

場景推薦
唯讀/讀多寫少、無事務、需全文搜尋/GISMyISAM
高併發寫入、需 ACID、行鎖、崩潰安全InnoDB
歷史歸檔大表、空間敏感MyISAM + myisampack
時間序列日誌、按周期分表彙總Merge (MyISAM 變體)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved