首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

InnoDB vs MyISAM 核心差異深度對比:鎖、事務、COUNT(*), 索引、外鍵

     編輯:MySQL 綜合教學

兩大引擎各有優劣,選型取決於業務讀寫模式與一致性要求。

基礎差異速查

特性MyISAMInnoDB
事務不支援支援 (ACID)
外鍵不支援支援
鎖粒度表鎖行鎖 (MVCC)
全文索引5.6 前唯一支援5.6+ 支援
COUNT(*) 無 WHEREO(1) 讀元資料O(N) 掃描聚簇索引
崩潰恢復無,易損壞Redo/Undo Log 自動恢復
AUTO_INCREMENT可建複合索引需單獨索引
DELETE 全表重建表 (快)逐行刪除 (慢)

鎖機制深度解析

MyISAM:表鎖 + 讀寫互斥

  • 讀鎖:共享,多讀並行。
  • 寫鎖:排他,阻塞所有讀寫。
  • 適用讀多寫少(如日誌、報表、資料倉庫)。

InnoDB:行鎖 + MVCC

  • 每行隱含版本號,讀取快照版本(不加鎖),寫入鎖定當前版本。
  • 讀寫不阻塞,高併發下吞吐量遠優於 MyISAM。
  • 注意:無索引或索引失效時會退化為表鎖(如 WHERE name LIKE '%aaa%')。

COUNT(*) 效能真相

  • MyISAM 儲存行數於 .MYI,COUNT(*) 瞬間返回。
  • InnoDB 無行數統計,COUNT(*) 需全掃聚簇索引。
    對策:COUNT(主鍵) + WHERE 唯一索引列 可走二級索引覆蓋掃描,大幅加速。

實測案例:500 萬行表 COUNT(*)

  • InnoDB:4 分 55 秒
  • 改為 MyISAM:0.01 秒

但不建議為此改引擎,失去事務/行鎖/崩潰恢復得不償失。應優化查詢或維護計數表/Redis 計數器。

選型建議

  • 核心業務(訂單、帳戶、庫存)→ InnoDB
  • 日誌、審計、唯讀報表、全文搜尋(5.6 前)→ MyISAM
  • 混合場景:核心表 InnoDB,輔助表 MyISAM,或統一 InnoDB + 外部搜尋引擎。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved