當 MyISAM 表包含任何可變長度欄位(VARCHAR、BLOB 或 TEXT),或在建表時指定 ROW_FORMAT=DYNAMIC 選項時,MySQL 會採用動態存儲格式。與靜態格式相比,動態格式的行結構更為複雜:每行開頭有一個標記行長度的頭部資訊。當記錄因更新而變長時,該記錄可能會分散儲存在多個位置,形成所謂的「行碎片」。
您可以使用 OPTIMIZE TABLE 或 myisamchk 工具對表進行碎片整理。如果表中同時存在頻繁訪問的固定長度欄位和可變長度欄位,為了避免碎片影響效能,將可變長度欄位拆分到另一張表中是一個不錯的設計思路。
NULL 值。被標記的欄位不佔用磁碟空間;非空字串以「長度字節 + 內容」形式存儲。OPTIMIZE TABLE 或 myisamchk -r 改善效能;用 myisamchk -ei 可查看表統計資訊。3 + (欄位數 + 7) / 8 + (字符欄位數) + (數值欄位壓縮後大小) + (字串長度總和) + (NULL欄位數 + 7) / 8
每個鏈接額外佔用 6 字節。更新導致記錄擴大時會產生鏈接,每個新鏈接至少 20 字節,後續擴大可能在同一鏈接內完成,否則建立新鏈接。可用 myisamchk -ed 查看鏈接數量,myisamchk -r 可移除所有鏈接。