MySQL多種索引引擎詳解
與其他數(shù)據(jù)庫例如Oracle 和SQL Server等數(shù)據(jù)庫中只有一種存儲引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換存儲引擎架構(gòu))的特性,也就意味著MySQL數(shù)據(jù)庫提供了多種存儲引擎。用戶可以根據(jù)不同的需求為數(shù)據(jù)表選擇不同的存儲引擎,用戶也可以根據(jù)自己的需要編寫自己的存儲引擎。MySQL數(shù)據(jù)庫在實際的工作中其實分為了語句分析層和存儲引擎層,其中語句分析層就主要負責與客戶端完成連接并且事先分析出SQL語句的內(nèi)容和功能,而存儲引擎層則主要負責接收來自語句分析層的分析結(jié)果,完成相應(yīng)的數(shù)據(jù)輸入輸出和文件操作。簡而言之,就是如何存儲數(shù)據(jù)、如何為存儲的數(shù)據(jù)建立索引和如何更新、查詢數(shù)據(jù)等技術(shù)的實現(xiàn)方法。因為在關(guān)系數(shù)據(jù)庫中數(shù)據(jù)的存儲是以表的形式存儲的,所以存儲引擎也可以稱為表類型(即存儲和操作此表的類型)。
存儲引擎種類
存儲引擎 | 說明 |
---|---|
MyISAM | 高速引擎,擁有較高的插入,查詢速度,但不支持事務(wù) |
InnoDB | 5.5版本后MySQL的默認數(shù)據(jù)庫,支持事務(wù)和行級鎖定,比MyISAM處理速度稍慢 |
ISAM | MyISAM的前身,MySQL5.0以后不再默認安裝 |
MRG_MyISAM(MERGE) | 將多個表聯(lián)合成一個表使用,在超大規(guī)模數(shù)據(jù)存儲時很有用 |
Memory | 內(nèi)存存儲引擎,擁有極高的插入,更新和查詢效率。但是會占用和數(shù)據(jù)量成正比的內(nèi)存空間。只在內(nèi)存上保存數(shù)據(jù),意味著數(shù)據(jù)可能會丟失 |
Falcon | 一種新的存儲引擎,支持事物處理,傳言可能是InnoDB的替代者 |
Archive | 將數(shù)據(jù)壓縮后進行存儲,非常適合存儲大量的獨立的,作為歷史記錄的數(shù)據(jù),但是只能進行插入和查詢操作 |
CSV | CSV 存儲引擎是基于 CSV 格式文件存儲數(shù)據(jù)(應(yīng)用于跨平臺的數(shù)據(jù)交換) |
接下來我們就介紹兩種在實際開發(fā)中使用最多的兩種引擎【MyISAM】和【InnoDB】。
MyISAM 引擎
這種引擎是MySQL最早提供的。這種引擎又可以分為靜態(tài)MyISAM、動態(tài)MyISAM 和壓縮MyISAM三種:
靜態(tài)MyISAM:如果數(shù)據(jù)表中的各數(shù)據(jù)列的長度都是預(yù)先固定好的,服務(wù)器將自動選擇這種表類型。因為 數(shù)據(jù)表中每一條記錄所占用的空間都是一樣的,所以這種表存取和更新的效率非常高。當數(shù)據(jù)受損時,恢復工作也比較容易做。
動態(tài)MyISAM:如果數(shù)據(jù)表中出現(xiàn)varchar、xxxtext或xxxBLOB字段時,服務(wù)器將自動選擇這種表類型。相對于靜態(tài)MyISAM,這種表存儲空間比較小,但由于每條記錄的長度不一,所以多次修改數(shù)據(jù)后,數(shù)據(jù)表中的數(shù)據(jù)就可能離散的存儲在內(nèi)存中,進而導致執(zhí)行效率下降。同時,內(nèi)存中也可能會出現(xiàn)很多碎片。因此,這種類型的表要經(jīng)常用optimize table 命令或優(yōu)化工具來進行碎片整理。
壓縮MyISAM:以上說到的兩種類型的表都可以用myisamchk工具壓縮。這種類型的表進一步減小了占用的存儲,但是這種表壓縮之后不能再被修改。另外,因為是壓縮數(shù)據(jù),所以這種表在讀取的時候要先時行解壓縮。
當然不管是何種MyISAM表,目前它都不支持事務(wù),行級鎖和外鍵約束的功能,這就意味著有事務(wù)處理需求的表,不能使用MyISAM存儲引擎。MyISAM存儲引擎特別適合在以下幾種情況下使用:
選擇密集型的表。MyISAM存儲引擎在篩選大量數(shù)據(jù)時非常迅速,這是它最突出的優(yōu)點。
插入密集型的表。MyISAM的并發(fā)插入特性允許同時選擇和插入數(shù)據(jù)。
MyISAM表是獨立于操作系統(tǒng)的,這說明可以輕松地將其從Windows服務(wù)器移植到Linux服務(wù)器;每當我們建立一個MyISAM引擎的表時,就會在本地磁盤上建立三個文件,文件名就是表名。 例如我創(chuàng)建了一個【test】表,那么就會生成以下三個文件:
文件名 | 說明 |
---|---|
test.frm | 存儲表定義 |
test.MYD | 存儲數(shù)據(jù) |
test.MYI | 存儲索引 |
InnoDB引擎
InnoDB表類型可以看作是對MyISAM的進一步更新產(chǎn)品,它提供了事務(wù)、行級鎖機制和外鍵約束的功能。InnoDB的表需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。 使用InnoDB是最理想的選擇:
更新密集的表:InnoDB存儲引擎特別適合處理多重并發(fā)的更新請求
事務(wù):InnoDB存儲引擎是支持事務(wù)的標準MySQL存儲引擎
自動災(zāi)難恢復:與其它存儲引擎不同,InnoDB表能夠自動從災(zāi)難中恢復
外鍵約束:MySQL支持外鍵的存儲引擎只有InnoDB
支持自動增加列AUTO_INCREMENT屬性
5. 總結(jié)
InnoDB:支持事務(wù)處理,支持外鍵,支持崩潰修復能力和并發(fā)控制。如果需要對事務(wù)的完整性要求比較高(比如銀行),要求實現(xiàn)并發(fā)控制(比如售票),那選擇InnoDB有很大的優(yōu)勢。如果需要頻繁的更新、刪除操作的數(shù)據(jù)庫,也可以選擇InnoDB,因為支持事務(wù)的提交(commit)和回滾(rollback)。
MyISAM:插入數(shù)據(jù)快,空間和內(nèi)存使用比較低。如果表主要是用于插入新記錄和讀出記錄,那么選擇MyISAM能實現(xiàn)處理高效率。如果應(yīng)用的完整性、并發(fā)性要求比較低,也可以使用。
注意,同一個數(shù)據(jù)庫也可以使用多種存儲引擎的表。如果一個表要求比較高的事務(wù)處理,可以選擇InnoDB。這個數(shù)據(jù)庫中可以將查詢要求比較高的表選擇MyISAM存儲。如果該數(shù)據(jù)庫需要一個用于查詢的臨時表,可以選擇MEMORY存儲引擎。