MySQL存儲引擎:MyISAM和InnoDB的區別


MyISAM和InnoDB的區別

定義

InnoDB:MySQL默認的事務型引擎,也是最重要和使用最廣泛的存儲引擎。它被設計成為大量的短期事務,短期事務大部分情況下是正常提交的,很少被回滾。InnoDB的性能與自動崩潰恢復的特性,使得它在非事務存儲需求中也很流行。除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。

MyISAM:在MySQL 5.1 及之前的版本,MyISAM是默認引擎。MyISAM提供的大量的特性,包括全文索引、壓縮、空間函數(GIS)等,但MyISAM並不支持事務以及行級鎖,而且一個毫無疑問的缺陷是崩潰后無法安全恢復。

事務

InnoDB:支持

MyISAM:不支持

InnoDB:支持行鎖、表鎖。行鎖是實現在索引上的,如果沒有索引,就沒法使用行鎖,將退化為表鎖。

MyISAM:支持表鎖。

主鍵

InnoDB:必須有,沒有指定會默認生成一個隱藏列作為主鍵

MyISAM:可以沒有

索引

InnoDB:聚集索引,使用 B+ 樹作為索引結構,數據文件和索引綁在一起,必須要有主鍵。主鍵索引一次查詢;輔助索引兩次查詢,先查詢主鍵,再查詢數據;

MyISAM:非聚集索引,使用 B+ 樹作為索引結構,索引和數據文件是分離的。主鍵索引和輔助索引是獨立的。

外鍵

InnoDB:支持

MyISAM:不支持

AUTO_INCREMENT

InnoDB:必須包含只有該字段的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。

MyISAM:可以和其他字段一起建立聯合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據前面幾列進行排序后遞增。

數據庫文件

InnoDB:frm是表定義文件,ibd是數據文件。支持兩種存儲方式:

  • 共享表空間存儲:所有表的數據文件和索引都保存在一個表空間里,一個表空間可以有多個文件,通過 innodb_data_file_pathinnodb_data_home_dir 參數設置共享表空間的位置和名字,一般共享表空間的名字叫 ibdata1-n
  • 多表空間存儲:每個表都有一個表空間文件用於存儲每個表的數據和索引,文件名以表名開關,以.ibd為擴展名

MyISAM:frm是表定義文件,myd是數據文件,myi是索引文件。支持三種存儲格式:靜態表(默認,注意數據末尾不能有空格,會被去掉。)、動態表、壓縮表。

表的行數

InnoDB:沒有保存。select count(*) from table;會掃描全表。

MyISAM:保存。select count(*) from table;會直接取出該值。

注:但加了 where 條件后,兩者處理方式一樣,都是掃描全表。

全文索引

InnoDB:5.7及以后版本支持。

MyISAM:支持。

總結

InnoDB

  • 優點:支持事務,支持外鍵,並發量較大,適合大量 update。
  • 缺點:查詢數據相對較快,不適合大量的 select。

MyISAM

  • 優點:查詢數據相對較快,適合大量的 select,可以全文索引。
  • 缺點:不支持事務,不支持外鍵,並發量較小,不適合大量 update。

如何選擇?

  • 你的數據庫有外鍵嗎?如有,選擇 InnoDB
  • 你需要事務支持嗎?如需要,選擇 InnoDB
  • 你需要全文索引嗎?在5.7及以后版本,都可選,優先考慮 InnoDB + Sphinx
  • 你經常使用什么樣的查詢模式?如果表中絕大多數都只是讀查詢,可以考慮 MyISAM,如果既有讀寫也挺頻繁,請使用 InnoDB
  • 你的數據有多大?數據量大,選擇 InnoDB,因為其支持事務處理和故障恢復。MyISAM 可能需要幾小時或幾天來恢復,InnoDB 只需要幾分鍾。
  • 你需要在線熱備份嗎?如需要,選擇 InnoDB

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM