MySQL之存儲引擎

MySQL由於其開源擴展方便等諸多優點成爲互聯網公司首選的數據庫。本文介紹一下MySQL的存儲引擎,那麼數據庫和存儲引擎是什麼關係?這要先從MySQL的架構開始講起。

MySQL架構

MySQL在邏輯上主要可以分爲5層,從上到下分別是 “連接器”-->“查詢緩存”-->“解析器”-->“優化器”-->“存儲引擎”

連接器模塊主要負責客戶端的連接處理,安全認證等。

查詢緩存模塊是MySQL的優化模塊,當遇到條件相同的查詢可以直接存該層獲取,不用查詢底層引擎。

解析器模塊負責解析sql語法。

優化器模塊會對解析器解析出來的語句進行分析優化,包括重寫查詢,決定表的讀取順序,選擇索引等。

位於最後一層的存儲引擎模塊則是真正存儲數據的地方。

常用存儲引擎簡介

MySQL的存儲引擎有很多種,每種存儲引擎都有不同的行爲,這裏我們主要介紹幾個常用的引擎。

1.InnoDB:

InnoDB是最爲常用的存儲引擎,我們日常開發中數據庫的大多數表都是基於InnoDB引擎,我們從以下幾個方面介紹一下它

1.事務級別,它實現了標準事務,由於平時鎖做開發大都有事務的要求,所以具備事務特性是必須的,InnoDB是MySQL的默認事務引擎,他被設計來處理大量的短事務,實現了標準的行級鎖定。它採用MVCC

MVCC:多版本併發控制,通過在每行記錄的後面加上兩個事務版本號來實現,一個保存行的創建版本號,一個保存過期版本號,對於可重複讀級別,select時只查找早於當前事務版本的記錄,insert時爲插入記錄保存當前版本號,delete時同樣保存當前版本號作爲刪除標識,update時保存當前版本號作爲行版本號,並把當前版本號作用到原來的記錄作爲刪除標識。使用mvcc可以使大多數操作不用加鎖,但是mvcc需要額外存儲空間以及維護工作,並且他只在讀已提交和可重複讀級別下工作

來支持高併發,默認的事務隔離級別是可重複讀,並通過間隙鎖防止幻讀

隔離級別:涉及數據庫的隔離級別以及各級別的問題,我們來複習一下,隔離級別由低到高分別是,讀未提交級別:可以讀取其他事務未提交的數據,這種現象稱爲髒讀;讀已提交:一個事務的兩個相同查詢因爲其他事務的修改可能返回不同的結果,這種現象稱爲不可重複讀;可重複讀級別:某個事務在查詢某一範圍的記錄時由於其他的事務在該範圍內插入了新的記錄,之前的事務再次讀取時會產生幻行,稱爲幻讀;串行化級別:事務的最高級別,強制事務串行執行,可以解決上面各個級別的缺陷,但是併發性能較差。

間隙鎖不僅會鎖定查詢到的行,還會對索引中的間隙進行鎖定,防止幻行的插入。

2.索引級別:支持多種類型的索引,HASH,BTREE等,InnoDB的表基於聚簇索引建立,意味着除了主鍵索引其他的索引都會攜帶主鍵列,所以如果主鍵很大的話其他列上的索引也都會很大,這也是主鍵要求儘量長度較小的原因(說到這給自己挖個坑,主鍵的生成算法,以後有時間再寫)。

3.數據安全,InnoDB之所以成爲主流的存儲引擎,還有個重要原因是他具備崩潰恢復功能,意味着即使數據在機器崩潰後不會丟失,並且InnoDB支持在線熱備份。

4.併發,前面說過InnoDB通過mvcc支持無鎖高併發,然而有些操作是必須要上鎖的,InnoDB採用行鎖處理多線程併發訪問,儘量減小鎖粒度,讀時採用共享鎖(shared),修改時採用獨佔鎖(exclusive),類似Java中的讀寫鎖。上面說的這些都是InnoDB主動幫我們完成的,稱之爲隱式鎖定,我們也可以主動使用語句來完成顯示鎖定,比如鎖表"LOCK TABLES ...",鎖指定的行 "SELECT..LOCK IN SHARE MODE"或者"SELECT ... FOR UPDATE"(後者在做併發時性能要求不高時可以採用作爲悲觀鎖,更常見的是使用樂觀鎖,樂觀鎖的原理同MVCC)。數據庫中的鎖同Java中的鎖一樣,使用不當會發生死鎖,而與Java不同的是,InnoDB會自動檢測死鎖並嘗試回滾最小的事務來打破死鎖

2.MyISAM:

除了InnoDB,用的最多的就是MyISAM了,大家可能聽過MyISAM引擎的count(*)速度很快,確實,他不僅在某些情況下速度比較快而且提供了很多特性比如壓縮表等,也因爲不是聚簇索引表佔用空間也比InnoDB小很多。但他有一個致命的缺點,不支持事務與行級鎖並且崩潰後無法安全恢復,這意味着在平常的應用開發中我們不會使用該引擎,但他可以用來做一些報表分析,日誌分析等應用,數據導入之後,數據不在進行修改操作,在這樣的場景下適合使用MyISAM引擎。

3.Memory

MySQL在執行查詢過程中如果需要使用臨時表來存儲數據,那麼數據就存儲在Memory表上,如果結果過大超出了限制,則會在轉爲MyISAM表,Memory由於在內存中,所以速度很快,在做sql優化的時候儘量減小生成臨時表的大小。

4.其他

MySQL還有一些其他的引擎,例如CVS引擎,他可以將CVS文件作爲MySQL的表來處理,然而該種情況下我們一般都是使用Hadoop來處理。還有Archive等一些引擎,就不說了,這些引擎我們幾乎不會用到,應用場景很少,想具體瞭解的可以去MySQL官網查看。

注:MySQL官方文檔關於InnoDB的行爲那一章內容很多,乾貨也很全,通讀之後可以大致瞭解InnoDB的行爲,如果有時間的話推薦大家去看一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章