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

MySQL數據庫區別於其餘數據庫的很重要的一個特色就是其插件式的表存儲引擎,其基於表,而不是數據庫。因爲每一個存儲引擎都有其特色,所以咱們能夠針對每一張表來挑選最合適的存儲引擎。mysql

做爲DBA,咱們應該深入的認識存儲引擎。今天介紹兩種最多見的存儲引擎和它們的區別:InnoDBMyISAM算法

InnoDB存儲引擎

InnoDB存儲引擎支持事務,其設計目標主要就是面向OLTP(On Line Transaction Processing 在線事務處理)的應用。特色爲行鎖設計、支持外鍵,並支持非鎖定讀。從5.5.8版本開始,InnoDB成爲了MySQL的默認存儲引擎。sql

InnoDB存儲引擎採用彙集索引(clustered)的方式來存儲數據,所以每一個表都是按照主鍵的順序進行存放,若是沒有指定主鍵,InnoDB會爲每行自動生成一個6字節的ROWID做爲主鍵。數據庫

MyISAM存儲引擎

MyISAM存儲引擎不支持事務、表鎖設計,支持全文索引,主要面向OLAP(On Line Analytical Processing 聯機分析處理)應用,適用於數據倉庫等查詢頻繁的場景。在5.5.8版本以前,MyISAMMySQL的默認存儲引擎。該引擎表明着對海量數據進行查詢和分析的需求。它強調性能,所以在查詢的執行速度比InnoDB更快。segmentfault

MyISAM存儲引擎還有一個特色是隻緩存索引文件,而不緩存數據文件,這點很是獨特。緩存

InnoDBMyISAM的區別

事務

爲了數據庫操做的原子性,咱們須要事務。保證一組操做要麼都成功,要麼都失敗,好比轉帳的功能。咱們一般將多條SQL語句放在begincommit之間,組成一個事務。安全

InnoDB支持,MyISAM不支持。併發

主鍵

因爲InnoDB的彙集索引,其若是沒有指定主鍵,就會自動生成主鍵。
MyISAM支持沒有主鍵的表存在。性能

外鍵

爲了解決複雜邏輯的依賴,咱們須要外鍵。好比高考成績的錄入,必須歸屬於某位同窗,咱們就須要高考成績數據庫裏有準考證號的外鍵。優化

InnoDB支持,MyISAM不支持。

索引

爲了優化查詢的速度,進行排序和匹配查找,咱們須要索引。好比全部人的姓名從a-z首字母進行順序存儲,當咱們查找zhangsan或者第44位的時候就能夠很快的定位到咱們想要的位置進行查找。

InnoDB是彙集索引,數據和主鍵的彙集索引綁定在一塊兒,經過主鍵索引效率很高。若是經過其餘列的輔助索引來進行查找,須要先查找到彙集索引,再查詢到全部數據,須要兩次查詢。

MyISAM是非彙集索引,數據文件是分離的,索引保存的是數據的指針。

InnoDB 1.2.x版本,MySQL5.6版本後,二者都支持全文索引。

auto_increment

對於自增數的字段,InnoDB要求必須有隻有該字段的索引。但MyISAM能夠將該字段與其餘字段組成聯合索引。

錶行數

很常見的需求是看錶中有多少條數據,此時咱們須要select count(*) from table_name

InnoDB不保存錶行數,須要進行全表掃描。MyISAM用一個變量保存,直接讀取該值,更快。當時當帶有where查詢的時候,二者同樣。

存儲

數據庫的文件都是須要在磁盤中進行存儲,當應用須要時再讀取到內存中。通常包含數據文件、索引文件。

InnoDB分爲:

  • .frm表結構文件
  • .ibdata1共享表空間
  • .ibd表獨佔空間
  • .redo日誌文件

MyISAM分爲三個文件:

  • .frm存儲表定義
  • .MYD存儲表數據
  • .MYI存儲表索引

執行速度

若是你的操做是大量的查詢操做,如SELECT,使用MyISAM性能會更好。
若是大部分是刪除和更改的操做,使用InnoDB

delete

調用delete from table時,MyISAM會直接重建表,InnoDB會一行一行的刪除,可是能夠用truncate table代替。參考: mysql清空表數據的兩種方式和區別

MyISAM僅支持表鎖,每次操做鎖定整張表。
InnoDB支持行鎖,每次操做鎖住最小數量的行數據。

表鎖相比於行鎖消耗的資源更少,且不會出現死鎖,但同時併發性能差。行鎖消耗更多的資源,速度較慢,且可能發生死鎖,可是由於鎖定的粒度小、數據少,併發性能好。若是InnoDB的一條語句沒法肯定要掃描的範圍,也會鎖定整張表。

當行鎖發生死鎖的時候,會計算每一個事務影響的行數,而後回滾行數較少的事務。

數據恢復

MyISAM崩潰後沒法快速的安全恢復。InnoDB有一套完善的恢復機制。

數據緩存

MyISAM僅緩存索引數據,經過索引查詢數據。InnoDB不只緩存索引數據,同時緩存數據信息,將數據按頁讀取到緩存池,按LRU(Latest Rare Use 最近最少使用)算法來進行更新。

如何選擇存儲引擎

建立表的語句都是相同的,只有最後的type來指定存儲引擎。

MyISAM

  1. 大量查詢總count
  2. 查詢頻繁,插入不頻繁
  3. 沒有事務操做

InnoDB

  1. 須要高可用性,或者須要事務
  2. 表更新頻繁

參考資料

  1. MySQL InnoDB索引原理和算法:https://segmentfault.com/a/11...
  2. 《MySQL技術內幕 InnoDB存儲引擎》 1.3節
  3. mysql清空表數據的兩種方式和區別:https://segmentfault.com/a/11...
  4. Mysql 中 MyISAM 和 InnoDB 的區別有哪些?:https://www.zhihu.com/questio...
  5. MySQL存儲引擎MyISAM與InnoDB區別總結整理:https://blog.csdn.net/xlgen15...
  6. MySQL InnoDB的存儲文件:https://blog.csdn.net/chenjia...
相關文章
相關標籤/搜索