學習足跡

2012年12月22日 星期六

在MySQL中MyISAM與InnoDB資料庫引擎比較

定義

MyISAM:MySQL Indexed Sequential Access Method(有索引的順序存取方法)
InnoDB

比較表


項目/資料表類型 MyISAM InnoDB 備註
效能 較佳 較差
  • InnoDB需要處理資料異動時的交易紀錄檔(Transaction Log),每次有交易產生時,仍至少須寫入硬碟一次,因此對於某些硬碟或磁碟陣列,會造成每秒200次的交易處理上限。若希望達到更高的效能且保持交易的完整性,就必使用軟碟快取與電池備援。當然 InnoDB 也提供數種對效能衝擊較低的模式,但相對的也會降低交易的完整性。
  • MyISAM不需要處理資料異動時的交易紀錄檔,所以在資料異動及存取上速度會較InnoDB快,且無磁碟存取問題,但這並非因為它比較先進,這只是因為MyISAM不支援交易。。
交易
(Transaction)
X(不支援)O(支援) InnoDB在進行連續的資料異動(交易),如果發生錯誤的話可以還原至錯誤交易發生前的正常狀態,MyISAM因不支援交易,所以沒辦法進行還原
錯誤處理 較差 較佳
  • MyISAM則必需要重新「完整」掃描後才能重新建立索引,所以修復的時間與資料亮多寡成正比
  • InnoDB可以藉由交易紀錄檔快速恢復成未出錯前的資料,修復時間大略固定
穩定性 較差 較佳 因為InnoDB發生錯誤時的處理較MyISAM好,所以穩定性較佳
讀/寫/快取 較差 較佳 InnoDB有自己的讀寫快取管理機制,MyISAM則必須依靠作業系統來管理讀取與寫入的快取
記憶體使用 較佳 較差 InnoDB目前並不支援MyISAM所提供的壓縮與 terse row formats,所以對硬碟與快取記憶體的使用量較大。因此MySQL從5.0版開始,提供另一個負載較輕的格式,他可減少約略 20% 的系統負載,而壓縮功能已計畫於未來的新版中推出。
外來鍵
(Foreign Key)
X(不支援) O(支援)
主鍵
(Primary Key)
依需求 必須要有 InnoDB如果沒有設定主鍵或者非空唯一索引,就會自動生成一個6字元的主鍵(不可見)
count(*)
(From All Table)
較佳 較差
  • MyISAM撈取預存的總行數
  • InnoDB重新撈取整個表做計算
  • 若有加WHERE條件則,兩者從取效率相同
全文檢索
(Full Text Search)
O(支援) 5.6.4+支援
DELETE FROM Table 較佳 較差
  • MyISAM會丟掉原本的表後,重新建立一個新的表
  • InnoDB會一筆一筆的刪資料,可以使用TRUNCATE Table去進行所有資料的刪除(要有Drop權限)
索引保存 表格名稱.MYI的檔案 與資料一起保存
鎖表
(Lock Table)
Tabel-level Row-level
  • MyISAM
    • 當資料表有寫入時,其他人無法讀取 (有少數例外,像是 bulk insert)
  • InnoDB
    • 只有「明確」的指定主鍵,MySQL 才會執行 Row lock (只鎖住被選取的資料例) ,否則 MySQL 將會執行 Table Lock (將整個資料表單給鎖住),還是有很大機會還是可以讀取。
1 1 1 1
建議 搜尋資料 異動資料
  • MyISAM
    • 大量SELECT與INSERT
    • 資料量小
    • 全文檢索
  • InnoDB
    • 大量UPDATE與INSERT
    • 需要使用Foreign Key
    • 資料量大
    • 交易
    • InnoDB預設是開啟自動提交(Auto Commit)的,如果你按照MyISAM的方法來編寫程式不會存在錯誤,只是性能會很低,可以使用Begin及Commit將多個異動語法綁在同一個交易中。
  • 共同
    • 有使用WHERE的欄位要使用索引


參考資料

沒有留言:

張貼留言