1. 程式人生 > >MySQL的資料儲存引擎

MySQL的資料儲存引擎

什麼是MySQL資料儲存引擎

一、 概念:

1. 什麼是儲存引擎?

MySQL的儲存引擎是MySQL體系架構中的重要組成部分,也是MySQL體系結構的核心,外掛式的儲存引擎更是它區別於其它資料庫的重要特徵。它處於MySQL體系架構中Server端底層,是底層物理結構的實現,用於將資料以各種不同的技術方式儲存到檔案或者記憶體中,不同的儲存引擎具備不同的儲存機制、索引技巧和鎖定水平。

MySQL中的資料用各種不同的技術儲存在檔案(或者記憶體)中。這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。

例如,如果你在研究大量的臨時資料,你也許需要使用記憶體MySQL儲存引擎。記憶體儲存引擎能夠在記憶體中儲存所有的表格資料。又或者,你也許需要一個支援事務處理的資料庫(以確保事務處理不成功時資料的回退能力)。

這些不同的技術以及配套的相關功能在 MySQL中被稱作儲存引擎(也稱作表型別)。 MySQL預設配置了許多不同的儲存引擎,可以預先設定或者在MySQL伺服器中啟用。你可以選擇適用於伺服器、資料庫和表格的儲存引擎,以便在選擇如何儲存你的資訊、如何檢索這些資訊以及你需要你的資料結合什麼效能和功能的時候為你提供最大的靈活性。

MySQL資料庫的儲存引擎是外掛式的

,本身MySQL已經提供了一系列的儲存引擎,本文主要是介紹自帶引擎的一些特性,有個需要注意的是,儲存引擎是基於表格的,而不是資料庫,就是說不能說某個資料庫是什麼引擎,而是某張表是什麼儲存引擎。

作用

關係資料庫表是用於儲存和組織資訊的資料結構,可以將表理解為由行和列組成的表格,類似於Excel的電子表格的形式。有的表簡單,有的表複雜,有的表根本不用來儲存任何長期的資料,有的表讀取時非常快,但是插入資料時去很差;而我們在實際開發過程中,就可能需要各種各樣的表,不同的表,就意味著儲存不同型別的資料,資料的處理上也會存在著差異,那麼。對於MySQL來說,它提供了很多種型別的儲存引擎(或者說不通的表型別),我們可以根據對資料處理的需求,選擇不同的儲存引擎,從而最大限度的利用MySQL強大的功能。

InnoDB:預設的MySQL外掛式儲存引擎,用於事務處理應用程式,具有眾多特性,包括ACID事務支援。

MyISAM:它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。注意,通過更改STORAGE_ENGINE配置變數,能夠方便地更改MySQL伺服器的預設儲存引擎。

BDB:可替代InnoDB的事務引擎,支援COMMIT、ROLLBACK和其他事務特性。

Memory:將所有資料儲存在RAM中,在需要快速查詢引用和其他類似資料的環境下,可提供極快的訪問。

Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個物件引用它們。對於諸如資料倉儲等VLDB環境十分適合。

Archive:為大量很少引用的歷史、歸檔、或安全審計資訊的儲存和檢索提供了完美的解決方案。

Federated:能夠將多個分離的MySQL伺服器連結起來,從多個物理伺服器建立一個邏輯資料庫。十分適合於分散式環境或資料集市環境。

Cluster/NDB:MySQL的簇式資料庫引擎,尤其適合於具有高效能查詢要求的應用程式,這類查詢需求還要求具有最高的正常工作時間和可用性。

CSV : 引用由逗號隔開的用作資料庫表的檔案。

Blackhole:用於臨時禁止對資料庫的應用程式輸入。

二、儲存引擎

1.我們常用的儲存引擎

① InnoDB儲存引擎

從MySQL資料庫5.5.8版本開始,預設儲存引擎是InnoDB,InnoDB一個最亮麗的特點就是支援事務,這個是以前舊的預設引擎MyISAM所不具備的。除此之外還有一些行鎖設計、支援外來鍵、併發控制等特性。在InnoDB裡面,表的儲存都是按照主鍵的順序進行存放,如果沒有顯式地顯示定義主鍵,InnoDB會為每一行生成一個6位元組的ROWID,並以此作為主鍵。

InnoDB提供了4種事務隔離級別,分別是:未提交讀(Read uncommitted)、已提交讀(Read committed)、可重複讀(Repeatable read)、可序列化(SERIALIZABLE)。

innodb具有以下優點 

災難恢復性好 

支援事務,預設的事務隔離級別是可重複讀,其事務控制是通過多版本併發控制來實現的。 

使用行級鎖 

對於InnoDB引擎中的表, 其資料的物理組織形式是簇表(Cluster Table) , 資料按主鍵來組織, 也就是說主鍵索引和資料是在一起的, 資料按主鍵的順序物理分佈。 資料表的另一種常見形式是非簇表, 其索引是有序的, 而資料是無序的。 

實現了緩衝管理, 不僅能緩衝索引也能緩衝資料, 並且會自動建立雜湊索引以加快資料的獲取。 相比之下, MyISAM只是快取了索引。(緩衝管理是指在專案執行過程中對於計劃階段設定緩衝的消耗和補充的跟蹤和評估。其目的是為專案提供一個簡單,易用的專案健康狀態檢視。這個專案狀態會和專案計劃和前期承諾進行比較,當出現較大的偏差的時候即需要採用相關的糾正行動。

支援外來鍵。 

支援熱備份(熱備份是在資料庫執行的情況下,採用archivelog mode方式備份資料庫的方法。即熱備份是系統處於正常運轉狀態下的備份。

使用表空間資料儲存 

innodb_file_per_table 

on:獨立表空間 

off:系統表空間 

比較: 

系統表空間無法簡單的收縮檔案大小 

系統表空間會產生IO瓶頸:獨立表空間可以向對多個檔案重新整理資料

② MyISAM儲存引擎

MyISAM儲存引擎

在MySQL 5.5.8以前的版本預設儲存引擎是MyISAM,但是MyISAM不支援事務、行鎖等特性。MyISAM儲存引擎表有MYD和MYI兩個檔案組成,MYD用來存放資料內容,MYI用來儲存索引內容。總體來講,MyISAM適合那些對資料管理比較簡單的場景。

可以配合鎖, 實現作業系統下的複製備份、 遷移。 

使用表級鎖, 併發性差。 

支援全文檢索(MySQL InonoDB在5.6以後也支援全文檢索) 。 

主機宕機後, MyISAM表易損壞, 災難恢復性不佳。 

無事務支援。 

只快取索引, 資料的快取是利用作業系統緩衝區來實現的。 可能引發過多的系統呼叫且效率不佳。 

資料緊湊儲存, 因此可獲得更小的索引和更快的全表掃描效能。 

1.MySAM儲存引擎有MYD和MYI組成 

2.特性:

併發性和鎖級別:對於讀寫操作是互斥的

表損壞修復:

支援索引

支援資料壓縮 

3.適合場景:

非事務型應用:

對於只讀的報表(可以壓縮)

空間函式:gps 

③ Memory儲存引擎

Memory儲存引擎

Memory儲存引擎(以前叫HEAP儲存引擎)顧名思義,這個引擎是把儲存內容放在記憶體裡面的,如果資料庫或者伺服器崩潰了,那麼記憶體資料都會丟失。它只適合用來存放一些臨時非重要資料。

MEMORY儲存引擎提供“記憶體”表, 也不支援事務、 外來鍵。 

使用記憶體表(記憶體引擎) 可以顯著提高訪問資料的速度, 可用於快取會頻繁訪問的、 可以重構的資料、 計算結果、 統計值、 中間結果, 但也有如下這些不足之處。 

使用的是表級鎖, 雖然記憶體訪問快, 但如果頻繁地讀寫, 表級鎖可能會成為瓶頸所在。 

只支援固定大小的行。 VARCHAR型別的欄位會儲存為固定長度的CHAR型別, 浪費空間。 

不支援TEXT、 BLOB欄位。 當有些查詢需要使用到臨時表(使用的也是MEMORY儲存引擎) 時如果表中有TEXT、 BLOB欄位, 那麼會轉化為基於磁碟的MyISAM表, 嚴重降低效能。 

由於記憶體資源成本昂貴, 一般不建議設定過大的記憶體表, 如果記憶體表滿了, 就會在MySQL錯誤日誌裡發現類似“Thetable‘table_name’is full”這樣的錯誤, 可通過清除資料或調整記憶體表引數來避免報錯。 

伺服器重啟資料會丟失 

④ ARCHIVE儲存引擎

ARCHIVE引擎 

ARCHIVE儲存引擎是被設計用來儲存企業中的大量流水資料的儲存引擎。 ARCHIVE引擎使用zlib無損資料壓縮, 讓資料都儲存在壓縮的存檔表中。 當資料被插入時, 它們被壓縮。 

它只支援INSERT和SELECT, 支援自增鍵及其上的索引, 不支援其他索引。 它適合做日誌記錄、 使用者行為分析, 不需要UPDATE、 DELETE和索引的資料

 

mysql的儲存引擎有很多,我們在實際使用的過程需要按照自己的需求去選擇,選擇的時候需要考慮以下因素 

是否需要事務支援。 

是否為高併發, InnoDB實現了行鎖, 這方面的表現大大優於MyISAM。 

索引, 不同儲存引擎的索引實現不盡相同。 

是否需要外來鍵。 

高效緩衝資料, InnoDB緩衝資料而MyISAM只緩衝了索引。 

備份, 是否需要支援熱備份。

 

不常用的儲存引擎

Federated儲存引擎

Federated這個引擎比較有意思,它並不存放資料,而是指向一臺遠端MySQL資料庫上的表,這個特性比較適合用來做資料庫的閘道器或者接入服務,防止客戶端可以直連到真正的資料庫。

 

Maria儲存引擎

Maria引擎的開發者是MySQL的創始人之一的Michael Widenius,它設計的目標是用來替換原有的MyISAM引擎,可以看成是MyISAM的後續版,Maria引擎的特點是支援快取資料和索引檔案、支援事務、行鎖等功能。我們現在談及的MySQL其實有兩個版本,一個是傳統先後被SUN、Oracle收購的版本,一個是原MySQL創始人Michael Widenius所開發的Maria版本,在一些linux發行版中當安裝MySQL服務時,雖然名字還是叫MySQL但是安裝的是Maria版本,具體可以自行去查閱關於MySQL和Maria之間的關係。

三、 MyISAM和InnoDB 比較(簡單版)

 

儲存引擎

  MyISAM

InnoDB 

 構成上的區別: 

每個MyISAM在磁碟上儲存成三個檔案。第一個檔案的名字以表的名字開始,副檔名指出檔案型別。

.frm檔案儲存表定義。

資料檔案的副檔名為.MYD (MYData)。

索引檔案的副檔名是.MYI (MYIndex)。

基於磁碟的資源是InnoDB表空間資料檔案和它的日誌檔案,InnoDB 表的大小隻受限於作業系統檔案的大小,一般為 2GB

 事務處理上方面: 

MyISAM型別的表強調的是效能,其執行數度比InnoDB型別更快,但是不提供事務支援

InnoDB提供事務支援事務,外部鍵(foreign key)等高階資料庫功能

SELECT,UPDATE,

INSERT,Delete操作

如果執行大量的SELECT,MyISAM是更好的選擇

a. 如果你的資料執行大量的INSERT 或 UPDATE,出於效能方面的考慮,應該使用InnoDB表

 

b. DELETE   FROM table時,InnoDB不會重新建立表,而是一行一行的刪除。

 

 C. LOAD   TABLE FROM MASTER操作對InnoDB是不起作用的,解決方法是首先把InnoDB表改成MyISAM表,匯入資料後再改成InnoDB表,但是對於使用的額外的InnoDB特性(例如外來鍵)的表不適用

對AUTO_INCREMENT

的操作(用於主鍵自動增長

a. 每表一個AUTO_INCREMEN列的內部處理。

 

b. MyISAM 為 INSERT 和 UPDATE 操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂的值被刪除之後就不能再利用。(當AUTO_INCREMENT列被定義為多列索引的最後一列,可以出現重使用從序列頂部刪除的值的情況)。

 

c. AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置

 

d. 對於AUTO_INCREMENT型別的欄位,InnoDB中必須包含只有該欄位的索引,但是在MyISAM表中,可以和其他欄位一起建立聯合索引

 

e. 更好和更快的auto_increment處理

a.如果你為一個表指定b.AUTO_INCREMENT列,在資料詞典裡的InnoDB表控制代碼包含一個名為自動增長計數器的計數器,它被用在為該列賦新值。

 

C.自動增長計數器僅被儲存在主記憶體中,而不是存在磁碟上

 

d.關於該計算器的演算法實現,請參考

 

e.AUTO_INCREMENT 列在 InnoDB 裡如何工作

表的具體行數

select count(*) from table,MyISAM只要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含  where條件時,兩種表的操作是一樣的

 InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行

表鎖

提供行鎖(locking on row level),提供與 Oracle 型別一致的不加鎖讀取(non-locking read in

   SELECTs),另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表, 例如update table set num=1 where name like “?a%”