innoDB、myisam、memory、BlackHole以及這幾個引擎的講解
innoDB儲存引擎
(1) innodb儲存引擎的mysql表提供了事務,回滾以及系統崩潰修復能力和多版本迸發控制的事務的安全。
(2)innodb支援自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話怎會進行自動存現有的值開始增值,如果有但是比現在的還大,則就儲存這個值。
(3)innodb儲存引擎支援外來鍵(foreign key) ,外來鍵所在的表稱為子表而所依賴的表稱為父表。
(4)innodb儲存引擎最重要的是支援事務,以及事務相關聯功能。
(5)innodb儲存引擎支援mvcc的行級鎖。
(6)innodb儲存引擎索引使用的是B+Tree。
mvcc類似於java中的讀鎖具體介紹可以看這篇文章:http://blog.csdn.net/chosen0ne/article/details/18093187
MyISAM儲存引擎
1、MyISAM 這種儲存引擎不支援事務,不支援行級鎖,只支援併發插入的表鎖,主要用於高負載的select。
2、MyISAM 型別的表支援三種不同的儲存結構:靜態型、動態型、壓縮型。
(1)靜態型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的資料型別),這樣mysql就會自動使用靜態myisam格式。
使用靜態格式的表的效能比較高,因為在維護和訪問的時候以預定格式儲存資料時需要的開銷很低。但是這高效能是有空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,佔據了整個空間。
(2)動態型:如果列(即使只有一列)定義為動態的(xblob, xtext, varchar等資料型別),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了效能的降低,因為如果某個欄位的內容發生改變則其位置很可能需要移動,這樣就會導致碎片的產生。隨著資料變化的怎多,碎片就會增加,資料訪問效能就會相應的降低。
對於因為碎片的原因而降低資料訪問性,有兩種解決辦法:
@1、儘可能使用靜態資料型別
@2、經常使用optimize table語句,他會整理表的碎片,恢復由於表的更新和刪除導致的空間丟失。
(如果儲存引擎不支援 optimize table 則可以轉儲並重新載入資料,這樣也可以減少碎片)
(3)壓縮型:如果在這個資料庫中建立的是在整個生命週期內只讀的表,則這種情況就是用myisam的壓縮型表來減少空間的佔用。
3、MyISAM也是使用B+tree索引但是和Innodb的在具體實現上有些不同。
MEMORY儲存引擎
(1)memory儲存引擎相比前面的一些儲存引擎,有點不一樣,其使用儲存在內從中的資料來建立表,而且所有的資料也都儲存在記憶體中。
(2)每個基於memory儲存引擎的表實際對應一個磁碟檔案,該檔案的檔名和表名是相同的,型別為.frm。該檔案只儲存表的結構,而其資料檔案,都是儲存在記憶體中,這樣有利於對資料的快速處理,提高整個表的處理能力。
(3)memory儲存引擎預設使用雜湊(HASH)索引,其速度比使用B-+Tree型要快,如果讀者希望使用B樹型,則在建立的時候可以引用。
(4)memory儲存引擎檔案資料都儲存在記憶體中,如果mysqld程序發生異常,重啟或關閉機器這些資料都會消失。所以memory儲存引擎中的表的生命週期很短,一般只使用一次。
BlackHole儲存引擎(黑洞引擎)
(1)支援事務,而且支援mvcc的行級鎖,主要用於日誌記錄或同步歸檔,這個儲存引擎除非有特別目的,否則不適合使用!
4.5:Memory儲存引擎的使用場合
速度要求快的,臨時資料丟失以後,對專案整體沒有或者負面影響不大的時候。