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

MyISAM vs InnoDB 效能實測:7000 萬筆資料下的儲存引擎選擇指南

     編輯:MySQL 資料庫相關知識

在處理大量資料的專案中,選擇正確的儲存引擎至關重要。針對 7,000 萬筆記錄的資料庫專案,筆者實測比較了 MyISAM 與 InnoDB 在不同索引類型下的 JOIN 查詢效能,結果顯示 InnoDB 在主鍵與整數索引查詢上具有顯著優勢,但字串索引表現略遜一籌。本文詳細記錄測試環境、數據結構、查詢語句與結果分析,為大型資料庫架構選型提供參考依據。

測試環境與資料結構

建立兩張結構相同的資料表,僅儲存引擎不同:

CREATE TABLE `jointable` (
  `pk_id` int(11) NOT NULL AUTO_INCREMENT,
  `indexed_int` int(11) DEFAULT NULL,
  `indexed_char` varchar(255) DEFAULT NULL,
  `randchar` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`pk_id`),
  KEY `idx_indexed_int` (`indexed_int`),
  KEY `idx_indexed_char` (`indexed_char`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

另一張表將 ENGINE=MyISAM 改為 ENGINE=InnoDB。每張表注入 250,000 筆測試資料。每次查詢前皆重啟資料庫並清空快取,確保測試公平性。

測試查詢語句

執行三種 JOIN 查詢,分別使用主鍵、整數索引、字串索引作為連接條件:

-- 使用主鍵 JOIN
SELECT COUNT(t1.randchar), COUNT(t2.randchar)
FROM jointable t1 INNER JOIN jointable t2 ON t1.pk_id = t2.pk_id;

-- 使用整數索引 JOIN
SELECT COUNT(t1.randchar), COUNT(t2.randchar)
FROM jointable t1 INNER JOIN jointable t2 ON t1.indexed_int = t2.indexed_int;

-- 使用字串索引 JOIN
SELECT COUNT(t1.randchar), COUNT(t2.randchar)
FROM jointable t1 INNER JOIN jointable t2 ON t1.indexed_char = t2.indexed_char;

測試結果對照表

引擎 Primary Key Int Index Char Index
MyISAM 3.09 秒 21.45 秒 7.95 秒
InnoDB 1.01 秒 18.48 秒 19.09 秒

結果分析與結論

  • 主鍵查詢:InnoDB (1.01s) 比 MyISAM (3.09s) 快約 3 倍,得益於叢集索引架構。
  • 整數索引查詢:InnoDB (18.48s) 略優於 MyISAM (21.45s),優勢明顯但幅度較小。
  • 字串索引查詢:MyISAM (7.95s) 顯著優於 InnoDB (19.09s),差距超過 2 倍。

架構選型建議

針對大型資料庫(千萬筆以上):

  1. 優先選擇 InnoDB:支援交易、行級鎖定、外鍵約束,主鍵與整數索引查詢效能優異,適合高併發寫入場景。
  2. 字串索引密集型應用:若查詢以 VARCHAR/CHAR 索引 JOIN 為主,MyISAM 可能表現較好,但需權衡失去交易支援的風險。
  3. 混合策略:核心業務表用 InnoDB,唯讀/分析型大表可評估 MyISAM 或改用全文搜尋引擎(如 Elasticsearch)。

補充說明

測試版本為較早期 MySQL 版本,新版本(5.7/8.0)InnoDB 對字串索引優化已大幅改善。實際專案建議依據具體版本、資料分佈、查詢模式進行基準測試後再決定。

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