MySql儲存引擎MyISAM和InnoDB

2021-09-23 06:10:58 字數 1950 閱讀 8487

什麼是儲存引擎?

mysql中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

例如,如果你在研究大量的臨時資料,你也許需要使用記憶體mysql儲存引擎。記憶體儲存引擎能夠在記憶體中儲存所有的**資料。又或者,你也許需要乙個支援事務處理的資料庫(以確保事務處理不成功時資料的回退能力)。

這些不同的技術以及配套的相關功能在 mysql中被稱作儲存引擎(也稱作表型別)。mysql預設配置了許多不同的儲存引擎,可以預先設定或者在mysql伺服器中啟用。你可以選擇適用於伺服器、資料庫和**的儲存引擎,以便在選擇如何儲存你的資訊、如何檢索這些資訊以及你需要你的資料結合什麼效能和功能的時候為你提供最大的靈活性。
在mysql 5.5版本前,預設的儲存引擎為myisam。在那之後mysql的預設儲存引擎改為innodb。這兩個儲存引擎都是非常經典的儲存引擎,因此在面試中也被經常拿來做對比。這兩個儲存引擎既有很多的不同點,但是也有一些相同點。下面詳細介紹一下。

1. myisam不支援事務,innodb支援事務。由於myisam在很長一段時間內是mysql的預設儲存引擎,所以在很多人的印象中mysql是不支援事務的資料庫。實際上,innodb是乙個效能良好的事務性引擎。它實現了四個標準的隔離級別,預設的隔離級別為可重複讀(repeatable read),並通過間隙鎖策略來防止幻讀的出現。此外它還通過多版本併發控制(mvcc)來支援高併發。

2. 對錶的行數查詢的支援不同。myisam內建了乙個計數器來儲存表的行數。執行 select count(*) 時直接從計數器中讀取,速度非常快。而innodb不儲存這些資訊,執行 select count(*)需要全表掃瞄。當表中資料量非常大的時候速度很慢。

3. 鎖的粒度不同。myisam僅支援表鎖。每次操作鎖住整張表。這種處理方式一方面加鎖的開銷比較小,且不會出現死鎖,但另一方面併發效能較差。innodb支援行鎖。每次操作鎖住一行資料,一方面行級鎖在每次獲取鎖和釋放鎖的操作需要消耗比表鎖更多的資源,速度較慢,且可能發生死鎖,但是另一方面由於鎖的粒度較小,發生鎖衝突的概率也比較低,併發性較好。此外,即使是使用了innodb儲存引擎,但如果mysql執行一條sql語句時不能確定要掃瞄的範圍,也會鎖住整張表。

4. 對主鍵的要求不同。myisam允許沒有主鍵的表存在。而如果在建表時沒有顯示的指定主鍵,innodb就會為每一行資料自動生成乙個6位元組的rowid列,並以此做為主鍵。這種主鍵對使用者不可見。innodb對主鍵採取這樣的策略是與它的資料和索引的組織方式有關的,下文會講到。

5. 資料和索引的組織方式不同。myisam將索引和資料分開進行儲存。索引存放在.myi檔案中,資料存放在.myd檔案中。索引中儲存了相應資料的位址。以表名+.myi檔案分別儲存。 innodb的主鍵索引樹的葉子節點儲存主鍵和相應的資料。其它的索引樹的葉子節點儲存的是主鍵。也正是因為採取了這種儲存方式,innodb才強制要求每張表都要有主鍵。

6. 對auto_increment的處理方式不一樣。如果將某個字段設定為increment,innodb中規定必須包含只有該字段的索引。但是在myisam中,也可以將該字段和其他字段一起建立聯合索引。

7. delete from table的處理方式不一樣。myisam會重新建立表。innodb不會重新建立表,而是一行一行的刪除。因此速度非常慢。推薦使用truncate table,不過需要使用者有drop此表的許可權。

8. myisam崩潰後無法安全恢復,innodb支援崩潰後的安全恢復。innodb實現了一套完善的崩潰恢復機制,保證在任何狀態下(包括在崩潰恢復狀態下)資料庫掛了,都能正常恢復。

9. myisam不支援外來鍵,innodb支援外來鍵。

10. 快取機制不同。myisam僅快取索引資訊,而不快取實際的資料資訊。而innodb不僅快取索引資訊,還會快取資料資訊。其將資料檔案按頁讀取到緩衝池,然後按最近最少使用的演算法來更新資料。

Mysql 儲存引擎之 MyISAM儲存引擎

myisam是預設儲存引擎。每個myisam在磁碟上儲存成三個檔案。frm檔案儲存表定義 myd檔案儲存資料 myi檔案儲存索引。要明確表示你想要用乙個myisam 請用engine表選項指出來 create table test myisam id int engine myisam 2 如下是m...

MyISAM儲存引擎

myisam是預設儲存引擎。它基於更老的isam 但有很多有用的擴充套件。注意mysql 5.1不支援isam 每個myisam在磁碟上儲存成三個檔案。第乙個檔案的名字以表的名字開始,副檔名指出檔案型別。frm檔案儲存表定義。資料檔案的擴充套件名為.myd mydata 索引檔案的副檔名是.myi ...

MyISAM儲存引擎

支援事務,支援外來鍵,尤其是訪問速度快,對事務完 整性沒有要求或者以select insert為主的應用基本都可以使用這個引擎來建立表。每個myisam在磁碟上儲存成3個檔案,其中檔名和表名都相同,但是副檔名分別為 1 frm 儲存表定義 2 myd mydata,儲存資料 3 myi myinde...