測試環境
- 硬體:AMD 2500+ (1.8GHz)、1GB RAM、80GB IDE
- 軟體:Windows XP SP2、PHP 5.2.1、MySQL 5.0.37、IIS 6
- 表結構:相同結構
id PK, name VARCHAR(100), content TEXT,分別用 MyISAM/InnoDB
測試數據內容
固定字串:name='heiyeluren',content 為約 1KB MySQL 儲存引擎介紹文本。
核心測試結果 (插入速度:筆/秒)
| 場景 | MyISAM 1W | MyISAM 10W | MyISAM 100W | InnoDB 1W | InnoDB 10W | InnoDB 100W |
| 預設 (innodb_flush_log_at_trx_commit=1) | 3 | 29 | 287 | 219 | 2092 | 未測 |
| innodb_flush_log_at_trx_commit=0 | 3 | 30 | 273 | 3 | 29 | 423 |
| innodb_buffer_pool_size=1024M | - | - | - | 3 | 33 | 607 |
| buffer_pool=256M + flush_log=1 + autocommit=0 | - | - | - | 3 | 26 | 379 |
關鍵發現
- innodb_flush_log_at_trx_commit=1 為效能殺手:每次提交強制刷盤,InnoDB 插入極慢。設為 0 或用
SET AUTOCOMMIT=0 手動提交可提升百倍。
- innodb_buffer_pool_size 影響有限:測試中 1GB vs 256MB 差異不大,瓶頸在刷盤而非緩衝池。
- MyISAM 插入極其穩定:受參數影響極小,但無事務、表鎖、易損壞。
- InnoDB 100W 達 607/s (最佳參數):適當配置下大數據量寫入效能可超越 MyISAM。
選型建議
| 場景 | 建議引擎 | 理由 |
| 非關鍵、讀多寫少、無事務、可容忍損壞風險 | MyISAM | 簡單、快、全文索引 |
| 關鍵業務、需事務、高併發寫入、行鎖、崩潰恢復 | InnoDB | ACID、行鎖、MVCC、自動恢復 |
| 混合負載 | 分表引擎 | 日誌/統計用 MyISAM,核心交易用 InnoDB |
配置關鍵點
[mysqld]
innodb_flush_log_at_trx_commit = 0 # 或 2 (折中:每秒刷盤)
innodb_buffer_pool_size = 70%_RAM
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
# 批量匯入時
SET AUTOCOMMIT=0; -- 手動提交事務