MyISAM 是 MySQL 5.5 之前的預設儲存引擎,以「高速讀取、全文索引、資料壓縮、GIS 支援」著稱,但不支援交易與行級鎖定,適合「讀多寫少、以 SELECT 為主」的場景(如內容管理、日誌分析、資料倉庫)。
.frm(結構定義)、.MYD(資料)、.MYI(索引)。CREATE TABLE mytable (
a INT NOT NULL PRIMARY KEY,
b CHAR(18) NOT NULL
) MAX_ROWS = 1000000000 AVG_ROW_LENGTH = 32;
透過 MAX_ROWS 與 AVG_ROW_LENGTH 告知預估資料量,MySQL 自動選擇足夠的指標位元組數。可用 SHOW TABLE STATUS LIKE 'mytable'\G 驗證 Max_data_length 是否達預期。調整既有表需 ALTER TABLE,會重寫整表與索引,耗時較久。
MyISAM 僅支援表級鎖:讀取加共享鎖,寫入加排他鎖。但具備 Concurrent Insert(並發插入) 特性:若表中無刪除產生的「空洞」,讀取查詢執行期間仍允許在表尾插入新資料,大幅緩解讀寫衝突。
--myisam-recover=FORCE 可在開啟表時自動檢測修復。CHECK TABLE / REPAIR TABLE;離線模式用 myisamchk 命令列工具。FULLTEXT),對複雜文字搜尋極具優勢。建表指定 DELAY_KEY_WRITE=1 或全域參數 delay_key_write=ON:索引變更先寫入記憶體緩衝區,僅在緩衝區滿或表關閉時刷入磁碟,大幅提升頻繁更新表的寫入效能。風險:非正常關機可能導致索引損壞,需搭配自動修復或啟動時 myisamchk 掃描。
適用於 CD/DVD、嵌入式裝置等「寫一次、讀多次」場景。使用 myisampack 壓縮後:
將多張結構相同的 MyISAM 表合併為一個虛擬表,適合日誌分表、資料倉庫分區查詢,簡化應用層 SQL。
OPTIMIZE TABLE:頻繁 UPDATE/DELETE 會產生碎片,定期整理可回收空洞、提升掃描效率。ALTER TABLE ... DISABLE KEYS → 匯入資料 → ENABLE KEYS,避免逐筆維護索引。key_buffer_size 容納熱門索引,減少磁碟 I/O。| 優勢場景 | 不適用場景 |
|---|---|
| 高頻 SELECT、全文搜尋、GIS、唯讀/歸檔資料、日誌/數倉 | 需要交易(ACID)、高並發寫入、行級鎖、外鍵約束 |
MyISAM 歷經多年打磨,特性豐富穩定。若專案符合上述優勢場景,仍是極具性價比的選擇;否則請轉向 InnoDB。