在處理大量資料的專案中,選擇正確的儲存引擎至關重要。針對 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 秒 |
針對大型資料庫(千萬筆以上):
測試版本為較早期 MySQL 版本,新版本(5.7/8.0)InnoDB 對字串索引優化已大幅改善。實際專案建議依據具體版本、資料分佈、查詢模式進行基準測試後再決定。