天天看點

淺談MySQL存儲引擎-InnoDB&MyISAM淺談MySQL存儲引擎-InnoDB&MyISAM

淺談MySQL存儲引擎-InnoDB&MyISAM

存儲引擎在MySQL的邏輯架構中位于第三層,負責MySQL中的資料的存儲和提取。MySQL存儲引擎有很多,不同的存儲引擎儲存資料和索引的方式是不同的。每一種存儲引擎都有它的優勢和劣勢,本文隻讨論最常見的InnoDB和MyISAM兩種存儲引擎進行讨論。本文中關于資料存儲形式和索引的可以檢視圖解MySQL索引

MySQL邏輯架構圖:

淺談MySQL存儲引擎-InnoDB&MyISAM淺談MySQL存儲引擎-InnoDB&MyISAM

InnoDB存儲引擎#

InnoDB是預設的事務型存儲引擎,也是最重要,使用最廣泛的存儲引擎。在沒有特殊情況下,一般優先使用InnoDB存儲引擎。

1️⃣、資料存儲形式

使用InnoDB時,會将資料表分為.frm 和 idb兩個檔案進行存儲。

淺談MySQL存儲引擎-InnoDB&MyISAM淺談MySQL存儲引擎-InnoDB&MyISAM

2️⃣、鎖的粒度

InnoDB采用MVCC(多版本并發控制)來支援高并發,InnoDB實作了四個隔離級别,預設級别是REPETABLE READ,并通過間隙鎖政策防止幻讀的出現。它的鎖粒度是行鎖。【通過MVCC實作,MVCC在稍後會進行介紹】

3️⃣、事務

InnoDB是典型的事務型存儲引擎,并且通過一些機制和工具,支援真正的熱備份。

4️⃣、資料的存儲特點

InnoDB表是基于聚簇索引(另一篇部落格有介紹)建立的,聚簇索引對主鍵的查詢有很高的性能,不過他的二級索引(非主鍵索引)必須包含主鍵列,索引其他的索引會很大。

MyISAM存儲引擎#

1️⃣、資料存儲形式

MyISAM采用的是索引與資料分離的形式,将資料儲存在三個檔案中.frm.MYD,.MYIs。

淺談MySQL存儲引擎-InnoDB&MyISAM淺談MySQL存儲引擎-InnoDB&MyISAM

2️⃣、鎖的粒度

MyISAM不支援行鎖,是以讀取時對表加上共享鎖,在寫入是對表加上排他鎖。由于是對整張表加鎖,相比InnoDB,在并發寫入時效率很低。

3️⃣、事務

MyISAM不支援事務。

4️⃣、資料的存儲特點

MyISAM是基于非聚簇索引進行存儲的。

5️⃣、其他

MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數,延遲更新索引鍵等。

進行壓縮後的表是不能進行修改的,但是壓縮表可以極大減少磁盤占用空間,是以也可以減少磁盤IO,進而提供查詢性能。

全文索引,是一種基于分詞建立的索引,可以支援複雜的查詢。

延遲更新索引鍵,不會将更新的索引資料立即寫入到磁盤,而是會寫到記憶體中的緩沖區中,隻有在清除緩沖區時候才會将對應的索引寫入磁盤,這種方式大大提升了寫入性能。

三、對比與選擇#

兩種存儲引擎各有各的有點,MyISAM專注性能,InnoDB專注事務。

兩者最大的差別就是InnoDB支援事務,和行鎖。

淺談MySQL存儲引擎-InnoDB&MyISAM淺談MySQL存儲引擎-InnoDB&MyISAM

如何在兩種存儲引擎中進行選擇?

① 是否有事務操作?有,InnoDB。

②是否存儲并發修改?有,InnoDB。

③是否追求快速查詢,且資料修改較少?是,MyISAM。

④是否使用全文索引?如果不引用第三方架構,可以選擇MyISAM,但是可以選用第三方架構和InnDB效率會更高。

四、淺談MVCC#

MySQL大多數事務型存儲引擎實作的都不是簡單的行鎖。基于提升并發性能的考慮,他們一般都同時實作了多版本并發控制(MVCC)。

可以認為MVCC是行級鎖的一個變種,它能在大多數情況下避免加鎖操作,是以開銷更低。無論怎樣實作,它們大豆實作了非阻塞的讀操作,寫操作也隻鎖定制定的行。

MVCC是通過儲存資料在某一個時間點的快照來實作的,也就是說無論事務執行多久,每個事務看到的資料都是一緻的。InnoDB的MVCC,是通過在每行記錄後面儲存兩個隐藏的列來實作,這兩個列一個儲存了行的建立時間,一個儲存了行的過期時間(或删除時間),當然,并非存儲的是時間,而是系統版本号。每開啟一個事務,版本号都會遞增,事務開始時刻的系統版本号會作為事務的版本号。

id name 建立時間(行版本号) 删除時間(删除版本号)
1 Mary 1 null
2 Jann 1 null

以InnoDB存儲引擎的的REPEATABLE READ隔離級别來說:

SELECT

​ ①隻查詢建立時間版本号小于目前事務版本号的資料行(保證事務讀取的行要麼在事務開始之前就存在,要麼是事務本身插入的行)

​ ②行的删除版本号要麼未定義,要麼大于目前事務版本号,這樣可以確定事務讀取到的行,在開始事務之前未被删除

隻有複合上訴兩個條件的記錄才會作為結果傳回

INSERT

​ 為插入的資料儲存目前系統版本号作為行版本号

DELETE

​ 儲存目前系統版本号作為删除行版本号

UPDATE

​ 插入一行資料,并将目前系統版本号賦予行版本号;同僚儲存目前系統版本号到原來的行作為删除版本号。

注:MVCC隻在REPEATABLE和READ COMMITTED兩個隔離級别下才能正常工作。

我的個人部落格:李強的個人部落格(基于SSM,Nginx+Redis的背景架構)