MySQL性能調優與架構設計(二)—— MySQL存儲引擎簡介

什麼是存儲引擎

  1. mysql中的數據用各類不一樣的技術存儲在文件(或者內存)中。
  2. 這些技術中每一種技術都使用不一樣的存儲機制、索引技巧、鎖定水平而且最終提供普遍的不一樣的功能和能力。
  3. 經過選擇不一樣的技術,你可以得到額外的速度和功能,從而改善你的應用的總體功能。
  4. 例如,你在研究大量的臨時數據,你也許須要使用內存mysql存儲引擎。內存存儲引擎可以在內存中存儲全部的表格數據。
  5. 又或者,你也許須要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。
  6. 這些不一樣的技術及配套的相關功能在mysql中被稱爲存儲引擎。

MySQL存儲引擎-前言

  1. mysql默認配置了許多不一樣的存儲引擎,能夠預先設置或者在mysql服務器中啓用。
  2. 你能夠選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你須要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。
  3. 對mysql來講,它提供了不少種類型的存儲引擎,咱們能夠根據對數據處理的需求,選擇不一樣的存儲引擎,從而最大限度的利用mysql強大的功能。
  4. mysql的插件式存儲引擎主要包括MyISAM、Innodb、NDB Cluster、Maria、Falcon、Memory、Archive、Merge、Federated 等。
  5. 其中最著名並且使用最普遍的是MyISAM和Innodb兩種存儲引擎。html

    (1)MyISAM是mysql最先的ISAM存儲引擎的升級版本,也是Mysql默認存儲引擎。
    (2)而Innodb實際上並非mysql公司的,而是第三方軟件公司Innobase所開發,其最大的特色是提供了事務控制等特性,因此使用者也很是普遍。
  6. 其餘的一些存儲引擎相對來講使用場景稍微少一些,都是應用於某些特定的場景。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 存儲引擎簡介

  1. myisam存儲引擎的表在數據庫中,每個表都被存放爲三個以表名命名的物理文件中。
  2. 首先確定會有任何存儲引擎都不可缺乏的存放表結構定義信息的.frm文件,另外還有.MYD和.MYI文件,分別存放了表的數據(.MYD)和索引數據(.MYI)。
  3. 每一個表有且僅有這樣三個文件做爲MyISAM存儲類型的表的存儲,也就是說,無論這個表有多少索引,都是存放在一個.MYI文件中。
  4. 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索引通常系統中都是不多用到的。
  5. 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類型,因此你們手工強行轉換的操做必定要謹慎。
  6. MyISAM存儲引擎的表是否足夠可靠?mysql參考手冊列出在遇到以下狀況的時候可能會出現表文件損壞:安全

    (1)當mysqld在作寫操做的時候被kill掉或者其餘狀況形成異常終止
    (2)主機crash
    (3)磁盤硬件故障
    (4)MyISAM存儲引擎中的BUG
  7. MyISAM表出錯後影響範圍:服務器

    (1)MyISAM存儲引擎的某個表文件出錯以後,僅影響到該表,而不會影響到其餘表,更不會影響到其餘的數據庫
    (2)若是咱們的數據庫正在運行過程當中發現某個MyISAM表出現問題了,則能夠在線經過check table命令嘗試校驗它,並能夠經過repair table命令嘗試修復。
    (3)在數據庫關閉狀態下,咱們也能夠經過myisamchk工具來對數據庫某個表進行檢測和修復。
    (4)不過強烈建議不到萬不得已不要輕易對錶進行修復操做,修復以前儘可能作好可能的備份工做,以避免帶來沒必要要的後果。
    (5)另外myisam存儲引擎的表,理論上是能夠被多個數據庫實例同時使用同時操做的,可是不建議這樣作,並且mysql官方文檔中也有提到,建議儘可能不要在多個mysqld之間共享MyISAM存儲文件。
  8. MyISAM只支持表級鎖。
  9. 用戶在操做myisam表時,select、update、delete、insert語句都會給表自動加鎖,若是加鎖之後的表知足insert併發的狀況下,能夠在表的尾部插入新的數據。也能夠經過lock table命令來鎖表,這樣操做主要是能夠模仿事務,可是消耗很是大,通常只在實驗演示中使用。

Innodb存儲引擎簡介

  1. 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】至因而每一個表單獨存放仍是全部表存放在一塊兒,徹底由用戶來決定(經過特定配置),同時還支持符號連接。
  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時刻已經完成但還沒來得及將數據寫入磁盤的事務恢復,也可以將全部部分完成並寫入磁盤的未完成事務回滾並將數據還原。
  3. Innodb不只在功能特性方面和MyISAM存儲引擎有較大區別,在配置上面也是單獨處理的。
  4. 在Mysql啓動參數文件設置中,Innodb的全部參數基本上都帶有前綴「innodb_」,不管是innodb數據和日誌相關,仍是一些其餘性能、事務等等相關的參數都是同樣。
  5. 和全部Innodb相關的系統變量同樣,全部的Innodb相關的系統狀態值也一樣所有以「innodb_」前綴。
  6. 咱們也能夠僅僅經過一個參數(skip-innodb)來屏蔽Mysql中的Innodb存儲引擎,這樣即便咱們在安裝編譯的時候將Innodb存儲引擎安裝進去,使用者也沒法建立Innodb表。

NDB Cluster存儲引擎簡介

  1. NDB存儲引擎也叫NDB Cluster存儲引擎,主要用於MySQL Cluster分佈式集羣環境
  2. Cluster是從Mysql 5.0纔開始提供的新功能。
  3. 這部分咱們不只僅只是介紹NDB存儲引擎,由於離開了Mysql Cluster整個環境,NDB存儲引擎也將失去太多意義
  4. 因此,這一節,主要介紹一下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節點羣。
  5. 上面提到了NDB節點對數據的組織,可能每一個節點都存有所有的數據也可能只保存一部分數據,主要是是受節點數目和參數來控制的。
  6. 首先在Mysql Cluster主配置文件中(在管理節點上,通常爲config.ini),有一個很是重要的參數叫NoOfReplicas,這個參數指定來每一份數據被冗餘存儲在不一樣節點上的份數,該參數通常至少應該被設置成2,也只須要設置成2就能夠了。
  7. 由於正常狀況下,兩個互爲冗餘的節點同時出現故障的機率仍是很是小的,固然若是機器和內存足夠多的話,也能夠繼續增大。
  8. 一個節點上面是保存全部數據仍是部分數據,還受到存儲節點數據的限制。
  9. NDB存儲引擎首先保證NoOfReplicas參數配置的要求對數據冗餘,來使用存儲節點,而後再根據節點數目將數據分段來繼續使用多餘的NDB節點,分段的數目爲節點總數除以NoOfReplicas參數所得。

Merge存儲引擎簡介

  1. Merge存儲引擎能夠簡單的理解爲其功能就是實現了對結構相同的MyISAM表,經過一些特殊包裝對外提供一個單一的訪問入口,以減少應用的複雜度的目的。
  2. 要建立Merge表,不只僅基表的結構要徹底一致,包括字段的順序,基表的索引也必須徹底一致。
  3. Merge表自己不存儲數據,僅僅只是爲多個基表提供一個統一的存儲入口。
  4. 因此在建立Merge表時,Mysql只會生成兩個較小的文件,一個是.frm的結構定義文件,一個是.MRG文件,用於存放參與Merge的表的名稱(包括所屬數據庫schema)。
  5. 之因此須要所屬數據庫的schema,是由於Merge表不只能夠實現將Merge同一個數據庫中的表,還能夠Merge不一樣數據庫中的表,只要權限容許,而且是在同一個mysqld下,就能夠進行Merge。
  6. Merge表被建立後,仍然能夠經過相關命令來更改底層的基表。
  7. Merge表不只能夠提供讀取服務,也能夠提供寫入服務。
  8. 要讓Merge表提供可Insert服務,必須在在表被建立的時候就指明Insert數據要被寫入哪個基表,能夠經過insert_method參數來控制。
  9. 沒法經過Merge表直接使用基表上面的全文索引,要使用全文索引,必須經過基表自己的存儲才能實現。

Memory存儲引擎簡介

  1. Memory存儲引擎,是一個將數據存儲在內存中的存儲引擎。
  2. Memory存儲引擎不會將任何數據存儲在磁盤上,僅僅存放了一個表結構相關信息的.frm文件在磁盤上面。
  3. 因此一旦Mysql Crash或者主機Crash以後,Memory的表就只剩下了一個結構了。
  4. Memory支持索引,而且同時支持Hash和B-Tree兩種格式的索引。
  5. 因爲是存放在內存中,因此Memory都是按照定長的空間來存儲數據的,並且不支持BLOB和TEXT類型的字段。
  6. Memory存儲引擎實現頁級鎖定。
  7. 既然全部數據都是存在內存中,那麼他對內存的消耗量可想而知。在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*))

BDB存儲引擎簡介

  1. BDB存儲引擎全稱爲BerkeleyDB存儲引擎,和Innodb同樣,也不是Mysql本身開發實現的一個存儲引擎,而是由Sleepycat Software所提供,固然,也是開源存儲引擎,一樣支持事務安全。
  2. BDB存儲引擎的數據存放也是每一個表兩個物理文件,一個.frm和一個.db文件,數據和索引信息都是存放在.db文件中。
  3. BDB爲了實現事務安全,也有本身的redo日誌,和Innodb同樣,也能夠經過參數來指定日誌文件的存放位置。
  4. 在鎖定機制方面,BDB和Memory存儲引擎同樣,實現頁級鎖定。
  5. 因爲BDB存儲引擎實現了事務安全,那麼他確定也須要有本身的check point機制。
  6. BDB在每次啓動的時候,都會作一次check point,而且將以前的全部redo日誌清空。
  7. 在運行過程當中,咱們也能夠經過執行flush logs來手工對BDB進行check point操做。

FEDERATED存儲引擎簡介

  1. FEDERATED存儲引擎所實現的功能,和Oracle的DBLINK基本類似,主要用來提供對遠程Mysql服務器上面的數據的訪問接口。
  2. 若是咱們使用源碼編譯來安裝mysql,那麼必須手工指定啓用FEDRATED存儲引擎才行,由於mysql默認是不啓用該存儲引擎的。
  3. 當咱們建立一個FEDERATED表的時候,僅僅在本地建立了一個表的結構定義信息的文件而已,全部數據均實時取自遠程mysql服務器上面的數據。
  4. 當咱們經過SQL操做FEDERATED表的時候,實現過程基本以下:

    (1)SQL調用被本地發佈
    (2)MYSQL處理器API(數據以處理器格式)
    (3)Mysql客戶端API(數據被轉換成SQL調用)
    (4)遠程數據庫->Mysql客戶端API
    (5)轉換結果包(若是有的話)處處理器格式
    (6)處理器API->結果行或受行影響的對本地的計數

ARCHIVE存儲引擎簡介

  1. ARCHIVE存儲引擎主要是經過較小的存儲空間來存放過時的不多訪問的歷史數據。
  2. ARCHIVE表不支持索引,經過一個.frm的結構定義文件,一個.ARZ的數據壓縮文件還有一個.ARM的meta信息文件。
  3. 因爲ARCHIVE表的特殊性,ARCHIVE表不支持刪除、修改操做,僅支持插入和查詢操做。
  4. 鎖定機制爲行級鎖定。

BLACKHOLE存儲引擎簡介

  1. BLACKHOLE存儲引擎是一個很是有意思的存儲引擎,功能恰如其名,就是一個「黑洞」。
  2. 就像咱們unix系統下面的「/dev/null」設備同樣,無論咱們寫入任何信息,都是有去無回。
  3. BLACKHOLE存儲引擎,寫入的任何數據都會消失,用於記錄binlog作複製的中繼存儲。
  4. Mysql的用戶手冊上還介紹了BLACKHOLE存儲引擎其餘幾個用途以下:

    (1)SQL文件語法的驗證
    (2)來自二進制日誌的開銷測量,經過比較容許二進制日誌功能的BLACKHOLE的性能與禁止二進制日誌功能的BLACKHOLE的性能。
    (3)由於BLACKHOLE存儲引擎本質上是一個「no-op」存儲引擎,它可能被用來查找與存儲引擎自身不相關的性能瓶頸。

CSV存儲引擎簡介

  1. CSV存儲引擎實際上操做的就是一個標準的CSV文件,他不支持索引。
  2. 其主要用途就是你們有些時候可能會須要經過數據庫中的數據導出成一份報表文件,而CSV文件是不少軟件都支持的一種較爲標準的格式。
  3. 因此咱們能夠經過先在數據庫中創建一張CSV表,而後將生成的報表信息插入到該表,便可獲得一份CSV報表文件了。

參考連接

https://www.cnblogs.com/jesse...

相關文章
相關標籤/搜索