MySQL 中最常用的兩種表類型:**MyISAM**(非事務、表鎖、高速讀)與 **InnoDB**(事務、行鎖、高並發寫)。選型本質是 **業務特徵與引擎特性的匹配**。
| 業務特徵 | 推薦引擎 | 理由 |
|---|---|---|
| 大量 INSERT/UPDATE、需事務、高並發寫入 | InnoDB | 行鎖+MVCC+Redo/Undo Log |
| 大量 SELECT、讀多寫少、無事務需求 | MyISAM | 表鎖開銷小、全表掃描快、COUNT(*) 瞬間返回 |
| 需外鍵約束、數據完整性關鍵 | InnoDB | 唯一支援外鍵的引擎 |
| 全文搜尋核心業務 (5.6 前) | MyISAM | 早期唯一支援 FULLTEXT |
| 跨平台文件級部署/遷移 | MyISAM | .MYD/.MYI/.frm 直接拷貝 |
| 崩潰安全、自動恢復 | InnoDB | 雙重寫緩衝+Redo Log 保證 |
CREATE TABLE AAA (
a1 VARCHAR(64) NOT NULL,
b2 VARCHAR(255),
c3 INT,
PRIMARY KEY (a1)
) ENGINE=InnoDB;
CREATE PROCEDURE sp_AAA()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE a1 CHAR(64);
DECLARE b2 CHAR(255);
WHILE i < 10000 DO
SET a1 = CONCAT('aaa', i);
SET b2 = CONCAT('bbbbbbbbbbbbbbbbbbbbbbb', i);
INSERT INTO aaa VALUES (a1, b2, i);
SET i = i + 1;
END WHILE;
END;
CALL sp_AAA(); -- InnoDB 耗時 295 秒
fsync 刷盤,機械硬盤隨機 I/O 成殺手innodb_flush_log_at_trx_commit = 2 -- 秒級刷盤,犧牲 1 秒數據
innodb_buffer_pool_size = 4G -- 核心緩衝區
innodb_log_file_size = 512M -- 減少 checkpoint
innodb_flush_method = O_DIRECT -- 繞過文件系統緩存
# 預期同測試:< 5 秒
SELECT COUNT(*) O(1) 返回TRUNCATE 兩者同為 DDL 快速操作UPDATE table SET num=1 WHERE name LIKE '%aaa%'; -- 無法用索引,全表掃描 → 表鎖
myisampack)、極速全掃描「MySQL InnoDB 性能差距這麼大麼?」
當年真相:5.0 時代 InnoDB 尚未成熟,缺乏核心優化(Group Commit、自適應哈希、多核擴展)。現代實況:MySQL 8.0 + NVMe + 適當調優,單機輕鬆 5 萬+ TPS,早已不是當年的性能。
「要事務、要並發、要外鍵 → InnoDB 無腦選」
「純讀、要全文、要拷貝部署 → MyISAM 還有用」
「不確定選 InnoDB,錯不了」
任何引擎都不是萬能藥。**認清業務讀寫比、事務需求、並發模式、部署約束**,匹配引擎特性,配合參數調優,才能榨乾硬體效能。