存儲引擎在MySQL的邏輯架構中位於第三層,負責MySQL中的數據的存儲和提取。MySQL存儲引擎有不少,不一樣的存儲引擎保存數據和索引的方式是不一樣的。每一種存儲引擎都有它的優點和劣勢,本文只討論最多見的InnoDB和MyISAM兩種存儲引擎進行討論。本文中關於數據存儲形式和索引的能夠查看圖解MySQL索引html
MySQL邏輯架構圖:cookie
InnoDB是默認的事務型存儲引擎,也是最重要,使用最普遍的存儲引擎。在沒有特殊狀況下,通常優先使用InnoDB存儲引擎。架構
1️⃣、數據存儲形式併發
使用InnoDB時,會將數據表分爲.frm 和 idb兩個文件進行存儲。mvc
2️⃣、鎖的粒度框架
InnoDB採用MVCC(多版本併發控制)來支持高併發,InnoDB實現了四個隔離級別,默認級別是REPETABLE READ,並經過間隙鎖策略防止幻讀的出現。它的鎖粒度是行鎖。【經過MVCC實現,MVCC在稍後會進行介紹】函數
3️⃣、事務高併發
InnoDB是典型的事務型存儲引擎,而且經過一些機制和工具,支持真正的熱備份。工具
4️⃣、數據的存儲特色性能
InnoDB表是基於聚簇索引(另外一篇博客有介紹)創建的,聚簇索引對主鍵的查詢有很高的性能,不過他的二級索引(非主鍵索引)必須包含主鍵列,索引其餘的索引會很大。
1️⃣、數據存儲形式
MyISAM採用的是索引與數據分離的形式,將數據保存在三個文件中.frm.MYD,.MYIs。
2️⃣、鎖的粒度
MyISAM不支持行鎖,因此讀取時對錶加上共享鎖,在寫入是對錶加上排他鎖。因爲是對整張表加鎖,相比InnoDB,在併發寫入時效率很低。
3️⃣、事務
MyISAM不支持事務。
4️⃣、數據的存儲特色
MyISAM是基於非聚簇索引進行存儲的。
5️⃣、其餘
MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數,延遲更新索引鍵等。
進行壓縮後的表是不能進行修改的,可是壓縮表能夠極大減小磁盤佔用空間,所以也能夠減小磁盤IO,從而提供查詢性能。
全文索引,是一種基於分詞建立的索引,能夠支持複雜的查詢。
延遲更新索引鍵,不會將更新的索引數據當即寫入到磁盤,而是會寫到內存中的緩衝區中,只有在清除緩衝區時候纔會將對應的索引寫入磁盤,這種方式大大提高了寫入性能。
兩種存儲引擎各有各的有點,MyISAM專一性能,InnoDB專一事務。二者最大的區別就是InnoDB支持事務,和行鎖。
如何在兩種存儲引擎中進行選擇?
① 是否有事務操做?有,InnoDB。
②是否存儲併發修改?有,InnoDB。
③是否追求快速查詢,且數據修改較少?是,MyISAM。
④是否使用全文索引?若是不引用第三方框架,能夠選擇MyISAM,可是能夠選用第三方框架和InnDB效率會更高。
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的後臺架構)