在 MySQL 資料庫架構中,選擇適合的儲存引擎直接影響效能與功能。MyISAM 與 InnoDB 是最常見的兩種引擎,它們在索引、鎖機制、事務支援等方面存在顯著差異:
早期版本中,MyISAM 原生支援 FULLTEXT 全文索引,而 InnoDB 在 MySQL 5.6 版本前不支援。現代版本中 InnoDB 已完整支援全文搜尋,且效能更優。
MyISAM 內建計數器,執行 SELECT COUNT(*) FROM table 時可直接讀取元資料,極速回傳。InnoDB 需掃描全表 計算行數,大數據量下效能差距明顯。但加上 WHERE 條件時,兩者機制相同。
InnoDB 要求 AUTO_INCREMENT 欄位必須為獨立索引或聯合索引的首欄;MyISAM 允許自增欄位包含在任意位置的聯合索引中。
DELETE FROM table 時,MyISAM 會重建表(鎖表),InnoDB 採用行級鎖逐行刪除,並發效能優勢顯著。但注意:InnoDB 若無法確定掃描範圍(如 WHERE name LIKE '%pattern%'),仍會退化為表鎖。
LOAD TABLE FROM MASTER 對 InnoDB 無效。遷移策略需先轉為 MyISAM 匯入再轉回,但使用外鍵等 InnoDB 專屬特性的表無法此法操作。
InnoDB 完整支援 ACID 事務 與外鍵約束,是交易型系統首選;MyISAM 不支援事務,適合以讀為主、不需資料完整性強一致性的場景。
採用最小足夠原則:TINYINT 代替 INT、CHAR(1) 存性別、ENUM 存固定值集合(省份、狀態)。盡量設定 NOT NULL 並給預設值,減少 NULL 判斷開銷。
MySQL 優化器對 JOIN 優化成熟,子查詢常產生臨時表。將 IN (SELECT...) 改寫為 INNER JOIN 或 LEFT JOIN 可顯著提升效能。
多條件合併查詢時,UNION ALL(不去重)比建立臨時表再查詢更高效,減少磁碟 I/O。
合理劃分事務範圍:越小越好。長事務持有鎖時間久,易造成阻塞與死鎖。確保「全成功或全失敗」的業務原子性。
最左前綴原則建立聯合索引;EXPLAIN 分析 key_len、ref、rows 指標。避免過度索引:寫入效能下降、佔用空間、優化器誤判風險。
SELECT *,明確列出欄位OR 改寫為 UNION 利用索引LIMIT 100000, 20 改為延遲關聯或游標分頁WHERE DATE(created_at) = '2024-01-01' 失效索引重點關注:type(目標 ref/range 以上)、key(實際用索引)、rows(預估掃描行)、Extra(Using index、Using where、Using temporary、Using filesort)。
垂直分表:將大欄位(TEXT/BLOB)、低頻欄位拆出,熱點表瘦身。
水平分表:按範圍(時間)、Hash(用戶 ID)分片,單表控制在 2000 萬行以內。中間件(ShardingSphere、MyCat)或應用層路由實現。
引擎選型無絕對優劣,唯有場景適配。優化是系統工程:從架構、索引、SQL、硬體多維度疊加。持續監控 Slow Query Log、Performance Schema,建立基準測試,才能讓 MySQL 穩健支撐業務增長。