承接上篇理論分析,本文呈現完整基準測試代碼與實測數據,客觀對比 InnoDB、MyISAM、Memory 三大引擎在寫入/讀取場景下的效能表現,並納入 .NET DataTable 記憶體操作作為參考基線。
| 項目 | 配置 |
|---|---|
| MySQL 版本 | 5.5.x (Windows) |
| 硬體 | 單機、SSD、16GB RAM |
| 測試語言 | C# (.NET 4.x) / MySql.Data 驅動 |
| 資料表結構 | id INT UNSIGNED AUTO_INCREMENT PK, obj CHAR(255) NOT NULL DEFAULT '' |
| 測試資料 | 固定字串 ~200 字元 |
| 寫入量 | 10,000 筆 |
| 讀取量 | 1,000 筆 (ID 8000~8999) |
| 隔離措施 | 每輪測試前重啟 MySQL 服務,清除 Query Cache |
| InnoDB 參數 | innodb_flush_log_at_trx_commit = 1(最嚴格持久化) |
CREATE DATABASE IF NOT EXISTS test CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';
USE test;
DROP TABLE IF EXISTS test_innodb;
CREATE TABLE test_innodb (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, obj CHAR(255) NOT NULL DEFAULT '') ENGINE=INNODB;
DROP TABLE IF EXISTS test_myisam;
CREATE TABLE test_myisam (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, obj CHAR(255) NOT NULL DEFAULT '') ENGINE=MYISAM;
DROP TABLE IF EXISTS test_memory;
CREATE TABLE test_memory (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, obj CHAR(255) NOT NULL DEFAULT '') ENGINE=MEMORY;
using System;
using System.Data;
using MySql.Data.MySqlClient;
namespace MySQLEngineTest {
class Program {
const string OBJ = "The MEMORY storage engine creates tables with contents that are stored in memory. Formerly, these were known as HEAP tables. MEMORY is the preferred term, although HEAP remains supported for backward compatibility.";
const string CONN = "Server=127.0.0.1;Port=3308;Uid=root;Pwd=root;Database=test;Charset=utf8;Pooling=true;";
const int LOOP_TOTAL = 10000;
const int LOOP_BEGIN = 8000;
const int LOOP_END = 9000;
// ... 省略重複的 Insert/Select 封裝方法 ...
static void Main(string[] args) {
// 順序:InnoDB → 重啟 → MyISAM → 重啟 → Memory → DataTable
InnoDBInsert(); InnoDBSelect(); RestartMySQL();
MyIsamInsert(); MyIsamSelect(); RestartMySQL();
MemoryInsert(); MemorySelect();
DataTableInsertAndSelect();
}
}
}


| 觀察現象 | 根本原因 | 實務啟示 |
|---|---|---|
| InnoDB 寫入顯著慢於 MyISAM/Memory | 行鎖機制、雙重寫緩衝、Redo/Undo Log 同步刷盤(innodb_flush_log_at_trx_commit=1) |
高寫入場景若不需嚴格 ACID,可調整為 2 或 0;或改用 MyISAM/Memory |
| 三引擎 SELECT 效能相近 | 測試資料量小、全載入記憶體、單執行緒、無並發壓力 | 高並發讀取時 InnoDB 行鎖優勢將顯現;Memory 表鎖成為瓶頸 |
| Memory 寫入雖快但非最優 | 表級鎖、單執行緒複製、固定行長度轉換開銷 | 適合「讀多寫少、資料可重建」場景(Session、快取、暫存表) |
| DataTable 完勝 | 零網路開銷、零序列化、零鎖競爭、純進程內記憶體 | 熱資料優先落本地快取;資料庫專注持久化與共享 |
max_heap_table_size(預設 16MB)限制,超過自動轉 MyISAM 磁碟表,效能暴跌。--init-file 自動重建。實測數據確認:Memory 引擎寫入效能介於 MyISAM 與 InnoDB 之間,讀取三引擎幾無差異。選型核心在於業務對持久化、並發、容量的真實需求,而非單純追求「記憶體最快」。