MySQL的儲存引擎
此文主要介紹了MySQL儲存引擎總結,講解了什麼是儲存引擎、MyISAM、InnoDB、MEMORY等內容
前言
在資料庫中存著一張張有著千絲萬縷關係的表,表的設計好壞將直接影響著整個資料庫。而在設計表的時候,我們都要首先考慮一個問題,就是使用什麼儲存引擎。那麼,什麼是儲存引擎呢?
什麼是儲存引擎?
引擎的概念:引擎是開發程式或系統的核心元件。利用引擎,開發者可以迅速建立、鋪設程式所需的功能,或利用其輔助程式的運轉。
儲存引擎就是指表的型別以及表在計算機上的儲存方式。
儲存引擎的概念為MySQL的特有,Oracle沒有專門的儲存引擎的概念,Oracle有OLTP和OLAP模式的區分。
不同的儲存引擎決定了MySQL資料庫中的表可以用不同的方式儲存。我們可以根據資料的特點來選擇不同的儲存引擎。 在MySQL客戶端中,使用以下命令可以檢視MySQL支援的引擎:
show engines;
在MySQL中儲存引擎有很多種。下面重點關注InnoDB、MyISAM、MEMORY這三種。
InnoDB儲存引擎
InnoDB給MySQL的表提供了事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全。在MySQL從3.23.34a開始包含InnnoDB。它是MySQL上第一個提供外來鍵約束的表引擎。而且InnoDB對事務處理的能力,也是其他儲存引擎不能比擬的。靠後版本的MySQL的預設儲存引擎就是InnoDB。
InnoDB儲存引擎支AUTO_INCREMENT。自動增長列的值不能為空,並且值必須唯一。MySQL中規定自增列必須為主鍵。在插入值的時候,如果自動增長列不輸入值,則插入的值為自動增長後的值;如果輸入的值為0或空(NULL),則插入的值也是自動增長後的值;如果插入某個確定的值,且該值在前面沒有出現過,就可以直接插入。
create table tbx(
sn int(4) primary key
auto_increment,
other fields...
);
or
create table tbx(
sn int(4) auto_increment,
primary key(sn),
other fields...);
InnoDB還支援外來鍵(FOREIGN KEY)。外來鍵所在的表叫做子表,外來鍵所依賴(REFERENCES)的表叫做父表。父表中被字表外來鍵關聯的欄位必須為主鍵。當刪除、更新父表中的某條資訊時,子表也必須有相應的改變,這是資料庫的參照完整性規則。
foreign key(tby's field) references tbx(field) on update cascade on delete cascade;
InnoDB中,建立的表的表結構儲存在.frm檔案中.
InnoDB的優勢在於提供了良好的事務處理、崩潰修復能力和併發控制。缺點是讀寫效率較差,佔用的資料空間相對較大。
MyISAM儲存引擎
MyISAM是MySQL中常見的儲存引擎,曾經是MySQL的預設儲存引擎。MyISAM是基於ISAM(Indexed Sequential Access Method【索引序列存取法】)引擎發展起來的,增加了許多有用的擴充套件。
MyISAM的表儲存成3個檔案。檔案的名字與表名相同。拓展名為frm、MYD、MYI。其實,frm檔案儲存表的結構;MYD檔案儲存資料,是MYData的縮寫;MYI檔案儲存索引,是MYIndex的縮寫。
基於MyISAM儲存引擎的表支援3種不同的儲存格式。包括靜態型、動態型和壓縮型。其中,靜態型是MyISAM的預設儲存格式,它的欄位是固定長度的;動態型包含變長欄位,記錄的長度不是固定的;壓縮型需要用到myisampack工具,佔用的磁碟空間較小。
MyISAM的優勢在於佔用空間小,處理速度快。缺點是不支援事務的完整性和併發性。
MEMORY儲存引擎
MEMORY是MySQL中一類特殊的儲存引擎。它使用儲存在記憶體中的內容來建立表,而且資料全部放在記憶體中。這些特性與前面的兩個很不同。
每個基於MEMORY儲存引擎的表實際對應一個磁碟檔案。該檔案的檔名與表名相同,型別為frm型別。該檔案中只儲存表的結構。而其資料檔案,都是儲存在記憶體中,這樣有利於資料的快速處理,提高整個表的效率。值得注意的是,伺服器需要有足夠的記憶體來維持MEMORY儲存引擎的表的使用。如果不需要了,可以釋放記憶體,甚至刪除不需要的表。
MEMORY預設使用雜湊索引。速度比使用B型樹索引快。當然如果你想用B型樹索引,可以在建立索引時指定。
注意,MEMORY用到的很少,因為它是把資料存到記憶體中,如果記憶體出現異常就會影響資料。如果重啟或者關機,所有資料都會消失。因此,基於MEMORY的表的生命週期很短,一般是一次性的。
怎樣選擇儲存引擎
在實際工作中,選擇一個合適的儲存引擎是一個比較複雜的問題。每種儲存引擎都有自己的優缺點,不能籠統地說誰比誰好。
InnoDB:
支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支援事務的提交(commit)和回滾(rollback)。
以下場合,使用InnoDB是最理想的選擇: 1.更新密集的表。InnoDB儲存引擎特別適合處理多重併發的更新請求。 2.事務。InnoDB儲存引擎是支援事務的標準MySQL儲存引擎。 3.自動災難恢復。與其它儲存引擎不同,InnoDB表能夠自動從災難中恢復。 4.外來鍵約束。MySQL支援外來鍵的儲存引擎只有InnoDB。 5.支援自動增加列AUTO_INCREMENT屬性。
MyISAM:
插入資料快,空間和記憶體使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比 較低,也可以使用。
MyISAM表無法處理事務,這就意味著有事務處理需求的表,不能使用MyISAM儲存引擎。MyISAM儲存引擎特別適合在以下幾種情況下使用:
1.查詢密集型的表。MyISAM儲存引擎在篩選大量資料時非常迅速,這是它最突出的優點。 2.插入密集型的表。MyISAM的併發插入特性允許同時選擇和插入資料。例如:MyISAM儲存引擎很適合管理郵件或Web伺服器日誌資料。
MEMORY:
所有的資料都在記憶體中,資料的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對資料的安全性要求較低,可以選擇MEMOEY。它對錶的大小有要求,不能建立太大的表。所以,這類資料庫只使用在相對較小的資料庫表。
一般在以下幾種情況下使用Memory儲存引擎:
1.目標資料較小,而且被非常頻繁地訪問。在記憶體中存放資料,所以會造成記憶體的使用,可以通過引數max_heap_table_size控制Memory表的大小,設定此引數,就可以限制Memory表的最大大小。
2.如果資料是臨時的,而且要求必須立即可用,那麼就可以存放在記憶體表中。
3.儲存在Memory表中的資料如果突然丟失,不會對應用服務產生實質的負面影響。
注意,同一個資料庫也可以使用多種儲存引擎的表。如果一個表要求比較高的事務處理,可以選擇InnoDB。這個資料庫中可以將查詢要求比較高的表選擇MyISAM儲存。如果該資料庫需要一個用於查詢的臨時表,可以選擇MEMORY儲存引擎。