一、資料引擎簡介
在MySQL 5.1中,MySQL AB引入了新的外掛程式式儲存引擎體繫結構,允許將儲存引擎載入到正在運新的MySQL伺服器中。
使用MySQL外掛程式式儲存引擎體繫結構,允許資料庫專 業人員為特定的應用需求選擇專門的儲存引擎,完全不需要管理任何特殊的應用編碼要求。採用MySQL伺服器體繫結構,由於在儲存層級上提供了一致和簡單的 應用程式模型和API,應用程式編程人員和DBA可不再考慮所有的底層實施細節。因此,儘管不同的儲存引擎具有不同的能力,應用程式是與之分離的。
MySQL支援數個儲存引擎作為對不同表的類型的處理器。MySQL儲存引擎包括處理事務安全表的引擎和處理非事務安全表的引擎:
· MyISAM管理非事務表。它提供高速儲存和檢索,以及全文檢索搜尋能力。MyISAM在所有MySQL配置裡被支援,它是預設的儲存引擎,除非你配置MySQL預設使用另外一個引擎。
· MEMORY儲存引擎提供“記憶體中”表。MERGE儲存引擎允許集合將被處理同樣的MyISAM表作為一個單獨的表。就像MyISAM一樣,MEMORY和MERGE儲存引擎處理非事務表,這兩個引擎也都被預設包含在MySQL中。
注釋:MEMORY儲存引擎正式地被確定為HEAP引擎。
· InnoDB和BDB儲存引擎提供事務安全表。BDB被包含在為支援它的作業系統發布的MySQL-Max二進位分發版裡。InnoDB也預設被包括在所有MySQL 5.1二進位分發版裡,你可以按照喜好通過配置MySQL來允許或禁止任一引擎。
· EXAMPLE儲存引擎是一個“存根”引擎,它不做什麼。你可以用這個引擎建立表,但沒有資料被儲存於其中或從其中檢索。這個引擎的目的是服務,在MySQL原始碼中的一個例子,它示範說明如何開始編寫新儲存引擎。同樣,它的主要興趣是對開發人員。
· NDB Cluster是被MySQL Cluster用來實現分割到多台電腦上的表的儲存引擎。它在MySQL-Max 5.1二進位分發版裡提供。這個儲存引擎當前只被Linux, Solaris, 和Mac OS X 支援。在未來的MySQL分發版中,我們想要添加其它平台對這個引擎的支援,包括Windows。
· ARCHIVE儲存引擎被用來無索引地,非常小地覆蓋儲存的大量資料。
· CSV儲存引擎把資料以逗號分隔的格式儲存在文本檔案中。
· BLACKHOLE儲存引擎接受但不儲存資料,並且檢索總是返回一個空集。
· FEDERATED儲存引擎把資料存在遠程資料庫中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未來的分發版中,我們想要讓它使用其它磁碟機或用戶端串連方法串連到另外的資料來源。
外掛程式式儲存引擎體繫結構提供了標準的管理和支援服務集合,它們對所有的基本存放裝置引擎來說是共同的。儲存引擎本身是資料庫伺服器的組件,負責對在物理伺服器層面上維護的基本資料進行實際操作。
這是一種高效的模組化體繫結構,它為那些希望專註於特定應用需求的人員提供了巨大的便利和益處,這類特殊應用需求包括資料倉儲、交易處理、高可用性情形等,同時還能利用獨立於任何儲存引擎的一組介面和服務。
應用程式編程人員和DBA通過位於儲存引擎之上的連接器API和服務層來處理MySQL資料庫。如果 應用程式的變化需要改變底層儲存引擎,或需要增加1個或多個額外的儲存引擎以支援新的需求,不需要進行大的編碼或進程更改就能實現這類要求。MySQL服 務器體繫結構提供了一致和便於使用的API,這類API適用於多種儲存引擎,通過該方式,該結構將應用程式與儲存引擎的底層複雜性隔離開來。
在中,以圖形方式介紹了MySQL外掛程式式儲存引擎體繫結構:
二、選擇儲存引擎
與MySQL一起提供的各種儲存引擎在設計時考慮了不同的使用方式。為了更有效地使用外掛程式式儲存體繫結構,最好瞭解各種儲存引擎的優點和缺點。
在下面的表格中,概要介紹了與MySQL一起提供的儲存引擎:
下述儲存引擎是最常用的:
· MyISAM:預設的MySQL外掛程式式儲存引擎,它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。注意,通過更改STORAGE_ENGINE配置變數,能夠方便地更改MySQL伺服器的預設儲存引擎。
· InnoDB:用於交易處理應用程式,具有眾多特性,包括ACID事務支援。
· BDB:可替代InnoDB的事務引擎,支援COMMIT、ROLLBACK和其他事務特性。
· Memory:將所有資料儲存在RAM中,在需要快速尋找引用和其他類似資料的環境下,可提供極快的訪問。
· Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個對象引用它們。對於諸如資料倉儲等VLDB環境十分適合。
· Archive:為大量很少引用的曆史、歸檔、或安全審計資訊的儲存和檢索提供了完美的解決方案。
· Federated:能夠將多個分離的MySQL伺服器連結起來,從多個物理伺服器建立一個邏輯資料庫。十分適合於分布式環境或資料集市環境。
· Cluster/NDB:MySQL的簇式資料庫引擎,尤其適合於具有高效能尋找要求的應用程式,這類尋找需求還要求具有最高的正常工作時間和可用性。
· Other:其他儲存引擎包括CSV(引用由逗號隔開的用作資料庫表的檔案),Blackhole(用於臨時禁止對資料庫的應用程式輸入),以及Example引擎(可為快速建立定製的外掛程式式儲存引擎提供協助)。
請記住,對於整個伺服器或方案,你並不一定要使用相同的儲存引擎,你可以為方案中的每個表使用不同的儲存引擎,這點很重要。
三、將儲存引擎指定給表
可以在建立新表時指定儲存引擎,或通過使用ALTER TABLE語句指定儲存引擎。
要想在建立表時指定儲存引擎,可使用ENGINE參數:
CREATE TABLE engineTest(
id INT
) ENGINE = MyISAM;
也可以使用TYPE選項到CREATE TABLE語句來告訴MySQL你要建立什麼類型的表。
CREATE TABLE engineTest(
id INT
) TYPE = MyISAM;
雖然TYPE仍然在MySQL 5.1中被支援,現在ENGINE是首選的術語。
如果你省略掉ENGINE或TYPE選項,預設的儲存引擎被使用。一般的預設是MyISAM,但 你可以用--default-storage-engine或--default-table-type伺服器啟動選項來改變它,或者通過設定 storage_engine或table_type系統變數來改變。
要想更改已有表的儲存引擎,可使用ALTER TABLE語句:
ALTER TABLEengineTestENGINE =ARCHIVE;
ALTER TABLE t ENGINE = MYISAM;
ALTER TABLE t TYPE = BDB;
如果你試著使用一個未被編譯進MySQL的儲存引擎,或者試著用一個被編譯進MySQL但沒有被 啟用的儲存引擎,MySQL取而代之地建立一個MyISAM類型的表。當你在支援不同儲存引擎的MySQL伺服器之間拷貝表的時候,上述的行為是很方便 的。(例如,在一個複製建立中,可能你的主伺服器為增加安全而支援事務儲存引擎,但從伺服器為更快的速度而僅使用非事務儲存引擎。)
在停用類型被指定時,自動用MyISAM表來替代,這會對MySQL的新使用者造成混淆。無論何時一個表被自動改變之時,產生一個警告。
MySQL總是建立一個.frm檔案來保持表和列的定義。表的索引和資料可能被儲存在一個或多個檔案裡,這取決於表的類型。伺服器在儲存引擎層級之上建立.frm檔案。單獨的儲存引擎建立任何需要用來管理表的額外檔案。
一個資料庫可以包含不同類型的表。
四、儲存引擎和事務
下述儲存引擎支援事務:
· InnoDB:通過MVCC支援事務,允許COMMIT、ROLLBACK和儲存點。
· NDB:通過MVCC支援事務,允許COMMIT和ROLLBACK。
· BDB:支援事務,允許COMMIT和ROLLBACK。
事務安全表(TST) 比起非事務安全表 (NTST)有幾大優勢:
· 更安全。即使MySQL崩潰或遇到硬體問題,要麼自動回復,要麼從備份加交易記錄恢複,你可以取回資料。
· 你可以合并許多語句,並用COMMIT語句同時接受它們全部(如果autocommit被禁止掉)。
· 你可以執行ROLLBACK來忽略你的改變(如果autocommit被禁止掉)。
· 如果更新失敗,你的所有改變都變回原來。(用非事務安全表,所有發生的改變都是永久的)。
· 事務安全儲存引擎可以給那些當前用讀得到許多更新的表提供更好的部署。
非事務安全表自身有幾個優點,因為沒有事務開支,所有優點都能出現:
· 更快
· 需要更少的磁碟空間
· 執行更新需要更少的記憶體
你可以在同一個語句中合并事務安全和非事務安全表來獲得兩者最好的情況。儘管如此,在autocommit被禁止掉的事務裡,變換到非事務安全表依舊即時提交,並且不會被復原。
雖然MySQL支援數個事務安全儲存引擎,為獲得最好結果,你不應該在一個事務那混合不同表類型。如果你混合表類型會發生問題,
五、插入搜尋引擎
能夠使用儲存引擎之前,必須使用INSTALL PLUGIN語句將儲存引擎plugin(外掛程式)裝載到mysql。例如,要想載入example引擎,首先應載入ha_example.so模組:
INSTALL PLUGINha_exampleSONAME 'ha_example.so';
檔案.so必須位於MySQL伺服器庫目錄下(典型情況下是installdir/lib)。
六、拔出儲存引擎
要想拔出儲存引擎,可使用UNINSTALL PLUGIN語句:
UNINSTALL PLUGINha_example;
如果拔出了正被已有表使用的儲存引擎,這些表將成為不可訪問的。拔出儲存引擎之前,請確保沒有任何錶使用該儲存引擎。
為了安裝外掛程式式儲存引擎,plugin檔案必須位於恰當的MySQL庫目錄下,而且發出INSTALL PLUGIN語句的使用者必須具有SUPER許可權。
建立table時可以通過engine關鍵字指定使用的儲存引擎,如果省略則使用系統預設的儲存引擎:
CREATE TABLE t (i INT) ENGINE = MYISAM;
查看系統中支援的儲存引擎類型:
mysql> show engines;
標準安裝程式中只提供部分引擎的支援,如果需要使用其他的儲存引擎,需要使用原始碼加不同的參數重新編譯。其中DEFAULT表明系統的預設儲存引擎,可以通過修改配置參數來變更:
default-storage-engine=MyISAM
查看某個儲存引擎的具體資訊
mysql> show engine InnoDB status\G;