其中最著名並且使用最普遍的是MyISAM和Innodb兩種存儲引擎。html
(1)MyISAM是mysql最先的ISAM存儲引擎的升級版本,也是Mysql默認存儲引擎。 (2)而Innodb實際上並非mysql公司的,而是第三方軟件公司Innobase所開發,其最大的特色是提供了事務控制等特性,因此使用者也很是普遍。
其餘的一些存儲引擎相對來講使用場景稍微少一些,都是應用於某些特定的場景。mysql
(1)如NDB Cluster雖然也支持事務,但主要是用於分佈式環境,屬於一個share nothing的分佈式數據庫存儲引擎。 (2)Maria是mysql最新開發的對MyISAM的升級版存儲引擎 (3)Falcon是mysql公司自行研發的爲了替代當前Innodb存儲引擎的一款帶有事務等高級特性的數據庫存儲引擎。 (4)Memory存儲引擎全部數據和全部均存儲與內存中,因此主要是用於一些臨時表,或者對性能要求極高,可是容許在主機Crash的時候丟失數據的特定場景下。 (5)Archive是一個數據通過高比例壓縮存放的存儲引擎,主要用於存放過時並且不多訪問的歷史信息,不支持索引。 (6)Merge和Federated在嚴格意義來講,並不能算做一個存儲引擎。 (7)由於Merge存儲引擎主要是將幾個基表merge在一塊兒,對外做爲一個表來提供服務,基表能夠基於其餘的幾個存儲引擎。 (8)而Federated實際上所作的事情,有點相似於Oracle的dblink,主要用於遠程存取其餘mysql服務器上面的數據。
MyISAM支持三種類型的索引:sql
(1)B-Tree索引: 【1】顧名思義,就是全部的索引節點都按照balance tree的數據結構存儲 【2】全部的索引數據節點都在葉節點 (2)R-Tree索引: 【1】R-Tree索引的存儲方式和B-Tree索引的存儲方式有一些區別 【2】主要設計用於爲存儲空間和多維數據的字段作索引 (3)Full-text索引: 【1】Full-text就是咱們常說的全文索引,他的存儲結構也是B-Tree 【2】主要是爲了解決咱們須要用like查詢的低效問題 (4)MyISAM索引的三種類型中,最常用的就是B-Tree索引,偶爾會使用到Full-text索引,但R-Tree索引通常系統中都是不多用到的。
MyISAM數據存放格式數據庫
(1)雖然每個MyISAM的表都是存放在一個相同後綴名的.MYD文件中,可是每個文件的存放格式實際上可能並非徹底同樣的。 (2)由於MyISAM的數據存放格式是分爲靜態(FIXED)固定長度、動態(DYNAMIC)可變長度、以及壓縮(COMPRESSED)這三種格式 (3)固然三種格式中是否壓縮徹底能夠任由咱們本身決定,能夠在建立表的時候經過ROW_FORMAT來指定{COMPRESSED | DEFAULT},也能夠經過myisampack工具來進行壓縮,默認是不壓縮的。 (4)而在非壓縮的狀況下,是靜態仍是動態,就和咱們表中各字段的定義相關了。 (5)只要表中有可變長度類型的字段存在,那麼該表就確定是DYNAMIC格式的; (6)若是沒有任何可變長度的字段,則爲FIXED格式; (7)固然,你也能夠經過alter table命令,強行將一個帶有VARCHAR類型字段的DYNAMIC的錶轉換爲FIXED,可是所帶來的結果是原varchar字段類型會被自動轉換成char類型。 (8)相反,若是將FIXED轉換爲DYNAMIC,也會將char類型字段轉換爲varchar類型,因此你們手工強行轉換的操做必定要謹慎。
MyISAM存儲引擎的表是否足夠可靠?mysql參考手冊列出在遇到以下狀況的時候可能會出現表文件損壞:安全
(1)當mysqld在作寫操做的時候被kill掉或者其餘狀況形成異常終止 (2)主機crash (3)磁盤硬件故障 (4)MyISAM存儲引擎中的BUG
MyISAM表出錯後影響範圍:服務器
(1)MyISAM存儲引擎的某個表文件出錯以後,僅影響到該表,而不會影響到其餘表,更不會影響到其餘的數據庫 (2)若是咱們的數據庫正在運行過程當中發現某個MyISAM表出現問題了,則能夠在線經過check table命令嘗試校驗它,並能夠經過repair table命令嘗試修復。 (3)在數據庫關閉狀態下,咱們也能夠經過myisamchk工具來對數據庫某個表進行檢測和修復。 (4)不過強烈建議不到萬不得已不要輕易對錶進行修復操做,修復以前儘可能作好可能的備份工做,以避免帶來沒必要要的後果。 (5)另外myisam存儲引擎的表,理論上是能夠被多個數據庫實例同時使用同時操做的,可是不建議這樣作,並且mysql官方文檔中也有提到,建議儘可能不要在多個mysqld之間共享MyISAM存儲文件。
Innodb其功能方面的特色:數據結構
(1)支持事務安裝: 【1】Innodb在功能方面最重要的一點就是對事務安全的支持 【2】並且實現了SQL92標準所定義的全部四個級別(READ UNCOMMITTED,READ COMMITTED,REPEATABLE READ和SERIALIZABLE) 【3】對事務安全的支持,無疑讓不少以前由於特殊業務要求而不得不放棄使用Mysql的用戶轉而支持mysql,以及對數據選型持觀望態度的用戶,也大大增長了對mysql的好感。 (2)數據多版本讀取: 【1】Innodb在支持事務的同時,爲了保證數據的一致性以及併發時候的性能,經過對undo信息,實現了數據的多版本讀取。 (3)鎖定機制的改進: 【1】Innodb改變了MyISAM的鎖機制,實現了行鎖。 【2】雖然Innodb的行鎖機制的實現是經過索引來完成的,但畢竟在數據庫中99%的SQL語句都是要使用索引來檢索數據的。 【3】因此,行鎖定機制也無疑爲Innodb在承受高併發壓力的環境下加強了不小的競爭力。 (4)實現外鍵: 【1】Innodb實現了外鍵引用這一數據庫的重要特性,使在數據庫端控制部分數據的完整性成爲可能。 【2】雖然不少數據庫系統調優專家都建議不要這樣作,可是對於很多用戶來講在數據庫端加如外鍵控制可能仍然是成本最低的選擇。 (5)物理存儲方面: 【1】Innodb存儲引擎也和MyISAM不太同樣,雖然也有.frm文件來存放表結構定義相關的元數據,可是表數據和索引數據是存放在一塊兒的。 【2】至因而每一個表單獨存放仍是全部表存放在一塊兒,徹底由用戶來決定(經過特定配置),同時還支持符號連接。
Innodb物理結構:併發
(1)數據文件(表數據和索引數據) 【1】存放數據表中的數據和全部的索引數據,包括主鍵和其餘普通索引。 【2】在Innodb中,存在了表空間(tablespace)這樣一個概念,可是他和Oracle的表空間又有較大的不一樣。 (2)Innodb的表空間分爲兩種 【1】共享表空間: 「1」也就是全部表和索引數據都存放在同一個表空間(一個或多個數據文件)中,經過innodb_data_file_path來指定,增長數據文件須要停機重啓。 「2」雖然咱們能夠自行設定使用共享表空間仍是獨享表空間來存放咱們的表,可是共享表空間必須存在。 「3」由於Innodb的undo信息和其餘一些元數據信息都是存放在共享表空間裏面的。 「4」共享表空間的數據文件是能夠設置爲固定大小和可自動擴展大小兩種形式的,自動擴展形式的文件能夠設置文件的最大大小和每次擴展量。 「5」在建立自動擴展的數據文件的時候,建議你們最好加上最大尺寸的屬性,一個緣由是文件系統自己是有必定大小限制的(可是Innodb不知道),還有一個緣由就是自身維護的方便。 「6」另外Innodb不只可使用文件系統,還可使用原始塊設備,也就是咱們常說的裸設備。 「7」當咱們當文件表空間快要用完的時候,咱們必需要爲其增長數據文件,固然,只有共享表空間有此操做 「8」共享表空間增長數據文件的操做比較簡單,只須要在innodb_data_file_path參數後面按照標準格式設置好文件路經和相關屬性便可,不過這裏有一點須要注意,就是Innodb在建立新數據文件的時候是不會建立目錄的,若是指定目錄不存在,則會報錯並沒有法啓動。 「9」Innodb在給共享表空間增長數據文件以後,必需要重啓數據庫系統才能生效,若是是使用裸設備,還須要有兩次重啓。 【2】獨享表空間:也就是每一個表的數據和索引被存放在一個單獨的.ibd文件中。 (3)日誌文件 【1】Innodb的日誌文件和Oracle的redo日誌比較相似,一樣能夠設置多個日誌組(最少2個) 【2】採用輪循策略來順序的寫入 【3】若是你的數據庫中建立來Innodb的表,那麼千萬別所有刪除innodb的日誌文件,由於極可能就會讓你的數據庫crash,沒法啓動,或者丟失數據。 【4】因爲Innodb是事務安全的存儲引擎,因此係統crash對他來講並不能形成很是嚴重的損失 【5】因爲有redo日誌的存在,有checkpoint機制的保護,Innodb徹底能夠經過redo日誌將數據庫crash時刻已經完成但還沒來得及將數據寫入磁盤的事務恢復,也可以將全部部分完成並寫入磁盤的未完成事務回滾並將數據還原。
因此,這一節,主要介紹一下MySQL Cluster的相關內容分佈式
(1)簡單的說,Mysql Cluster實際上就是在無共享存儲設備的狀況下實現的一種內存數據庫Cluster環境,其主要是經過NDB存儲引擎來實現的。 (2)一個Mysql Cluster的環境主要由三部分組成: 【1】負責管理各個節點的Manage節點主機: 「1」管理節點負責整個Cluster集羣中各個節點的管理工做,包括集羣的配置,啓動關閉節點,以及實施數據的備份恢復等。 「2」管理節點會獲取整個Cluster環境中各節點的狀態和錯誤信息,而且將各Cluster集羣中各個節點的信息反饋給整個集羣中其餘全部節點。 「3」因爲管理節點上保存了整個Cluster環境的配置,同時擔任了集羣中的各節點的基本工做,全部他必須是最早被啓動的節點。 【2】SQL層的SQL服務器節點,也就是咱們常說的mysql server: 「1」主要負責實現一個數據庫在存儲層之上的全部事情,好比鏈接管理、query優化和響應、cache管理等等。 「2」只有存儲層的工做交給了NDB數據節點去處理了。 「3」也就是說,在純粹的Mysql Cluster環境中的SQL節點,能夠被認爲是一個不須要提供任何存儲引擎的mysql服務器,由於他的存儲引擎有Cluster環境的NDB節點來擔任。 「4」因此,SQL層各mysql服務器的啓動與普通的mysql服務器啓動有必定區別,必需要添加ndbcluster項,能夠添加在my.cnf配置文件中,也能夠經過啓動命令行來啓動。 【3】Storage層的NDB數據節點,也就是上面說的NDB Cluster: 「1」NDB是一個內存式存儲引擎,也就是說,他會把全部的數據和索引都load到內存中,但也會將數據持久化到存儲設備中。 「2」最新版本中,已經支持用戶本身選擇數據能夠不所有load到內存中了,這對於有些數據量太大或者基於成本考慮而沒有足夠內存空間來存放全部數據的用戶來講的確是一個大好消息。 「3」NDB節點主要是實現底層數據存儲功能,保存Cluster的數據。 「4」每個NDB節點保存完整數據的一部分(或者一份完整的數據,視節點數目和配置而定),在mysql cluster中叫作一個fragment。 「5」而每個fragment,正常狀況來說都會在其餘的主機上有一份(或者多份)徹底相同的鏡像存在。 「6」這些都是經過配置來完成的,因此只要配置得當,Mysql Cluster在存儲層不會出現單點的問題。 「7」通常來講,NDB節點被組織成一個一個的NDB Group,一個NDB Group實際上就是一組存有徹底相同的物理數據的NDB節點羣。
既然全部數據都是存在內存中,那麼他對內存的消耗量可想而知。在Mysql用戶手冊上面有這樣一個公式來計算Memory表實際所須要消耗的內存大小:高併發
SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4) + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2) + ALIGN(length_of_row+1, sizeof(char*))
當咱們經過SQL操做FEDERATED表的時候,實現過程基本以下:
(1)SQL調用被本地發佈 (2)MYSQL處理器API(數據以處理器格式) (3)Mysql客戶端API(數據被轉換成SQL調用) (4)遠程數據庫->Mysql客戶端API (5)轉換結果包(若是有的話)處處理器格式 (6)處理器API->結果行或受行影響的對本地的計數
Mysql的用戶手冊上還介紹了BLACKHOLE存儲引擎其餘幾個用途以下:
(1)SQL文件語法的驗證 (2)來自二進制日誌的開銷測量,經過比較容許二進制日誌功能的BLACKHOLE的性能與禁止二進制日誌功能的BLACKHOLE的性能。 (3)由於BLACKHOLE存儲引擎本質上是一個「no-op」存儲引擎,它可能被用來查找與存儲引擎自身不相關的性能瓶頸。