首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Memory 引擎效能實測(二):InnoDB、MyISAM、Memory 三引擎與 .NET DataTable 多維對比

     編輯:MySQL 資料庫相關知識

承接上篇理論分析,本文呈現完整基準測試代碼與實測數據,客觀對比 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();
        }
    }
}

實測結果與圖表分析

寫入 10,000 筆耗時對比(單位:百奈秒,越低越好)

寫入效能柱狀圖

  • .NET DataTable: ~1.2M(純記憶體操作,基線參考)
  • Memory 引擎: ~4.5M(最快資料庫引擎,約 DataTable 3.7 倍)
  • MyISAM: ~5.8M
  • InnoDB: ~28M(最慢,約 Memory 6.2 倍,MyISAM 4.8 倍)

讀取 1,000 筆耗時對比

讀取效能柱狀圖

  • 三引擎讀取效能極度接近(Memory 略勝一籌),均在 0.8M~1.0M 區間。
  • DataTable 讀取 ~0.3M,仍具優勢但差距縮小。

深度解析與結論

觀察現象根本原因實務啟示
InnoDB 寫入顯著慢於 MyISAM/Memory 行鎖機制、雙重寫緩衝、Redo/Undo Log 同步刷盤(innodb_flush_log_at_trx_commit=1) 高寫入場景若不需嚴格 ACID,可調整為 2 或 0;或改用 MyISAM/Memory
三引擎 SELECT 效能相近 測試資料量小、全載入記憶體、單執行緒、無並發壓力 高並發讀取時 InnoDB 行鎖優勢將顯現;Memory 表鎖成為瓶頸
Memory 寫入雖快但非最優 表級鎖、單執行緒複製、固定行長度轉換開銷 適合「讀多寫少、資料可重建」場景(Session、快取、暫存表)
DataTable 完勝 零網路開銷、零序列化、零鎖競爭、純進程內記憶體 熱資料優先落本地快取;資料庫專注持久化與共享

Memory 引擎生產環境避坑指南

  1. 資料易失性: 重啟即消失,嚴禁存放不可重建的業務核心資料。
  2. 容量上限: 受 max_heap_table_size(預設 16MB)限制,超過自動轉 MyISAM 磁碟表,效能暴跌。
  3. 不支援 BLOB/TEXT: 變長欄位會轉固定長度,嚴重浪費記憶體。
  4. 並發寫入瓶頸: 表鎖導致高並發寫入嚴重退化,考慮 InnoDB 或 MySQL Cluster (NDB)。
  5. 複寫陷阱: 主庫重啟後 Memory 表清空,從庫不知情仍舊舊資料,需配合 --init-file 自動重建。

延伸閱讀

實測數據確認:Memory 引擎寫入效能介於 MyISAM 與 InnoDB 之間,讀取三引擎幾無差異。選型核心在於業務對持久化、並發、容量的真實需求,而非單純追求「記憶體最快」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved