原文出處:
https://blog.csdn.net/gaohuanjie/article/details/50944782
https://www.cnblogs.com/xiaohaillong/p/6079551.html
1,什么是數(shù)據(jù)庫引擎?
說實話,平時用mysql,還是停留在創(chuàng)建表使用表這樣而已,單純的小開發(fā)根本也涉及不到。所以一直沒搞懂數(shù)據(jù)庫引擎是什么東西,最近在網(wǎng)上看到這樣一篇文章,寫到:
數(shù)據(jù)庫中的存儲引擎其實是對使用了該引擎的表進行某種設(shè)置,數(shù)據(jù)庫中的表設(shè)定了什么存儲引擎,那么該表在數(shù)據(jù)存儲方式、數(shù)據(jù)更新方式、數(shù)據(jù)查詢性能以及是否支持索引等方面就會有不同的“效果”。
2,mysql的各種引擎:
在MySQL數(shù)據(jù)庫中存在著多種引擎(不同版本的MySQL數(shù)據(jù)庫支持的引擎不同),熟悉各種引擎才能在軟件開發(fā)中應用引擎,從而開發(fā)出高性能的軟件。(也就是涉及到數(shù)據(jù)庫引擎,是為了進一步提升數(shù)據(jù)庫的性能,根據(jù)不同的需求而采用不同的引擎才會使用到,當然,真正的企業(yè)級項目,特別是大型項目,選用適合的引擎就尤為重要了!)
一般來說,MySQL有以下幾種引擎:ISAM、MyISAM(常用)、InnoDB(常用)、HEAP(也稱為MEMORY)、CSV、BLACKHOLE、ARCHIVE、PERFORMANCE_SCHEMA、?Berkeley、Merge、Federated和Cluster/NDB等,除此以外我們也可以參照MySQL++ API創(chuàng)建自己的數(shù)據(jù)庫引擎。
?ISAM
? ? ? ??該引擎在讀取數(shù)據(jù)方面速度很快,而且不占用大量的內(nèi)存和存儲資源;但是ISAM不支持事務(wù)處理、不支持外來鍵、不能夠容錯、也不支持索引。該引擎在包括MySQL 5.1及其以上版本的數(shù)據(jù)庫中不再支持。
?MyISAM
? ? ? ??它是MySql的默認引擎(5.5以前),但不提供事務(wù)的支持,也不支持行級鎖和外鍵。該引擎基于ISAM數(shù)據(jù)庫引擎,除了提供ISAM里所沒有的索引和字段管理等大量功能,MyISAM還使用一種表格鎖定的機制來優(yōu)化多個并發(fā)的讀寫操作,但是需要經(jīng)常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間,否則碎片也會隨之增加,最終影響數(shù)據(jù)訪問性能。MyISAM還有一些有用的擴展,例如用來修復數(shù)據(jù)庫文件的MyISAMChk工具和用來恢復浪費空間的 MyISAMPack工具。
????????MyISAM強調(diào)了快速讀取操作,主要用于高負載的select,這可能也是MySQL深受Web開發(fā)的主要原因:在Web開發(fā)中進行的大量數(shù)據(jù)操作都是讀取操作,所以大多數(shù)虛擬主機提供商和Internet平臺提供商(Internet Presence Provider,IPP)只允許使用MyISAM格式。MyIASM引擎是保存了表的行數(shù),于是當進行Select count(*) from table語句時,可以直接的讀取已經(jīng)保存的值而不需要進行掃描全表。所以,如果表的讀操作遠遠多于寫操作時,并且不需要事務(wù)的支持的??梢詫yIASM作為數(shù)據(jù)庫引擎的首先。
? ? ??MyISAM類型的表支持三種不同的存儲結(jié)構(gòu):靜態(tài)型、動態(tài)型、壓縮型。
?靜態(tài)型:指定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數(shù)據(jù)類型),這樣MySQL就會自動使用靜態(tài)MyISAM格式。使用靜態(tài)格式的表的性能比較高,因為在維護和訪問以預定格式存儲數(shù)據(jù)時需要的開銷很低;但這種高性能是以空間為代價換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準,占據(jù)了整個空間。
?動態(tài)型:如果列(即使只有一列)定義為動態(tài)的(xblob, xtext, varchar等數(shù)據(jù)類型),這時MyISAM就自動使用動態(tài)型,雖然動態(tài)型的表占用了比靜態(tài)型表較少的空間,但帶來了性能的降低,因為如果某個字段的內(nèi)容發(fā)生改變則其位置很可能需要移動,這樣就會導致碎片的產(chǎn)生,隨著數(shù)據(jù)變化的增多,碎片也隨之增加,數(shù)據(jù)訪問性能會隨之降低。?對于因碎片增加而降低數(shù)據(jù)訪問性這個問題,有兩種解決辦法:
? ? ? ? ?a、盡可能使用靜態(tài)數(shù)據(jù)類型;
? ? ? ? b、經(jīng)常使用optimize table table_name語句整理表的碎片,恢復由于表數(shù)據(jù)的更新和刪除導致的空間丟失。如果存儲引擎不支持 optimize ????????????????table? ?table_name則可以轉(zhuǎn)儲并重新加載數(shù)據(jù),這樣也可以減少碎片;
?壓縮型:如果在數(shù)據(jù)庫中創(chuàng)建在整個生命周期內(nèi)只讀的表,則應該使用MyISAM的壓縮型表來減少空間的占用。
?InnoDB
? ? ? ??該存儲引擎為MySQL表提供了ACID事務(wù)支持、系統(tǒng)崩潰修復能力和多版本并發(fā)控制(即MVCC Multi-Version Concurrency Control)的行級鎖;該引擎支持自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空則自動從現(xiàn)有值開始增值,如果有但是比現(xiàn)在的還大,則直接保存這個值; 該引擎存儲引擎支持外鍵(foreign key) ,外鍵所在的表稱為子表而所依賴的表稱為父表。該引擎在5.5后的MySQL數(shù)據(jù)庫中為默認存儲引擎。
它的設(shè)計的目標就是處理大數(shù)據(jù)容量的數(shù)據(jù)庫系統(tǒng)。它本身實際上是基于Mysql后臺的完整的系統(tǒng)。Mysql運行的時候,Innodb會在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是,該引擎是不支持全文搜索的。同時,啟動也比較的慢,它是不會保存表的行數(shù)的。當進行Select count(*) from table指令的時候,需要進行掃描全表。所以當需要使用數(shù)據(jù)庫的事務(wù)時,該引擎就是首選。由于鎖的粒度小,寫操作是不會鎖定全表的。所以在并發(fā)度較高的場景下使用會提升效率的。
? ? ? ???MyISAM? ?VSInnodb
大容量 的數(shù)據(jù)集時趨向于選擇Innodb。因為它支持事務(wù)處理和故障的恢復。Innodb可以利用數(shù)據(jù)日志來進行數(shù)據(jù)的恢復。主鍵的查詢在Innodb也是比較快的。
大批量的插入語句時(這里是INSERT語句)在MyIASM引擎中執(zhí)行的比較的快,但是UPDATE語句在Innodb下執(zhí)行的會比較的快,尤其是在并發(fā)量大的時候。
MyIASM引擎,B+樹的數(shù)據(jù)結(jié)構(gòu)中存儲的內(nèi)容實際上是實際數(shù)據(jù)的地址值。也就是說它的索引和實際數(shù)據(jù)是分開的,只不過使用索引指向了實際數(shù)據(jù)。這種索引的模式被稱為非聚集索引。
Innodb引擎的索引的數(shù)據(jù)結(jié)構(gòu)也是B+樹,只不過數(shù)據(jù)結(jié)構(gòu)中存儲的都是實際的數(shù)據(jù),這種索引有被稱為聚集索引。
HEAP(也稱為MEMORY)
? ? ? ??該存儲引擎通過在內(nèi)存中創(chuàng)建臨時表來存儲數(shù)據(jù)。每個基于該存儲引擎的表實際對應一個磁盤文件,該文件的文件名和表名是相同的,類型為.frm。該磁盤文件只存儲表的結(jié)構(gòu),而其數(shù)據(jù)存儲在內(nèi)存中,所以使用該種引擎的表擁有極高的插入、更新和查詢效率。這種存儲引擎默認使用哈希(HASH)索引,其速度比使用B-+Tree型要快,但也可以使用B樹型索引。由于這種存儲引擎所存儲的數(shù)據(jù)保存在內(nèi)存中,所以其保存的數(shù)據(jù)具有不穩(wěn)定性,比如如果mysqld進程發(fā)生異常、重啟或計算機關(guān)機等等都會造成這些數(shù)據(jù)的消失,所以這種存儲引擎中的表的生命周期很短,一般只使用一次。
?CSV(Comma-Separated Values逗號分隔值)
? ? ? ??使用該引擎的MySQL數(shù)據(jù)庫表會在MySQL安裝目錄data文件夾中的和該表所在數(shù)據(jù)庫名相同的目錄中生成一個.CSV文件(所以,它可以將CSV類型的文件當做表進行處理),這種文件是一種普通文本文件,每個數(shù)據(jù)行占用一個文本行。該種類型的存儲引擎不支持索引,即使用該種類型的表沒有主鍵列;另外也不允許表中的字段為null。
? BLACKHOLE(黑洞引擎)
? ? ? ??該存儲引擎支持事務(wù),而且支持mvcc的行級鎖,寫入這種引擎表中的任何數(shù)據(jù)都會消失,主要用于做日志記錄或同步歸檔的中繼存儲,這個存儲引擎除非有特別目的,否則不適合使用。詳見博客《BlackHole 存儲引擎》
? ?ARCHIVE
???該存儲引擎非常適合存儲大量獨立的、作為歷史記錄的數(shù)據(jù)。區(qū)別于InnoDB和MyISAM這兩種引擎,ARCHIVE提供了壓縮功能,擁有高效的插入速度,但是這種引擎不支持索引,所以查詢性能較差一些。
? PERFORMANCE_SCHEMA
? ? ? ??該引擎主要用于收集數(shù)據(jù)庫服務(wù)器性能參數(shù)。這種引擎提供以下功能:提供進程等待的詳細信息,包括鎖、互斥變量、文件信息;保存歷史的事件匯總信息,為提供MySQL服務(wù)器性能做出詳細的判斷;對于新增和刪除監(jiān)控事件點都非常容易,并可以隨意改變mysql服務(wù)器的監(jiān)控周期,例如(CYCLE、MICROSECOND)。
? ? Berkeley(BDB)
? ? ? ?該存儲引擎支持COMMIT和ROLLBACK等其他事務(wù)特性。該引擎在包括MySQL 5.1及其以上版本的數(shù)據(jù)庫中不再支持。
?Merge
該引擎將一定數(shù)量的MyISAM表聯(lián)合而成一個整體。參見博客《MySQL Merge存儲引擎》
? ? Federated
該存儲引擎可以不同的Mysql服務(wù)器聯(lián)合起來,邏輯上組成一個完整的數(shù)據(jù)庫。這種存儲引擎非常適合數(shù)據(jù)庫分布式應用。
? ?Cluster/NDB
? ? ? ??該存儲引擎用于多臺數(shù)據(jù)機器聯(lián)合提供服務(wù)以提高整體性能和安全性。適合數(shù)據(jù)量大、安全和性能要求高的場景。
mysql存儲引擎:
MySQL服務(wù)器采用了模塊化風格,各部分之間保持相對獨立,尤其體現(xiàn)在存儲架構(gòu)上。存儲引擎負責管理數(shù)據(jù)存儲,以及MySQL的索引管理。通過定義的API,MySQL服務(wù)器能夠與存儲引擎進行通信。目前使用最多的是MyISAM和InnoDB。InnoDB被Oracle收購后,MySQL自行開發(fā)的新存儲引擎Falcon將在MySQL6.0版本引進。
MyISAM引擎是一種非事務(wù)性的引擎,提供高速存儲和檢索,以及全文搜索能力,適合數(shù)據(jù)倉庫等查詢頻繁的應用。MyISAM中,一個table實際保存為三個文件,.frm存儲表定義,.MYD存儲數(shù)據(jù),.MYI存儲索引。
InnoDB則是一種支持事務(wù)的引擎。所以的數(shù)據(jù)存儲在一個或者多個數(shù)據(jù)文件中,支持類似于Oracle的鎖機制。一般在OLTP應用中使用較廣泛。如果沒有指定InnoDB配置選項,MySQL將在MySQL數(shù)據(jù)目錄下創(chuàng)建一個名為ibdata1的自動擴展數(shù)據(jù)文件,以及兩個名為ib_logfile0和ib_logfile1的日志文件。
創(chuàng)建table時可以通過engine關(guān)鍵字指定使用的存儲引擎,如果省略則使用系統(tǒng)默認的存儲引擎:CREATE TABLE t (i INT) ENGINE = MYISAM;
查看系統(tǒng)中支持的存儲引擎類型:
1mysql> show engines;| Engine | Support | Comment || MyISAM | YES | Default engine as of MySQL 3.23 with greatperformance |
2| MEMORY | YES | Hash based, stored in memory, useful for temporarytables |
3| InnoDB | DEFAULT | Supports transactions, row-level locking, andforeign keys |
4| BerkeleyDB | NO | Supports transactions and page-level locking|
5| BLACKHOLE | NO | /dev/null storage engine (anything you write toit disappears) |
6| EXAMPLE | NO | Example storage engine |
7| ARCHIVE | YES | Archive storage engine |
8| CSV | NO | CSV storage engine |
9| ndbcluster | NO | Clustered, fault-tolerant, memory-based tables|
10| FEDERATED | NO | Federated MySQL storage engine |
11| MRG_MYISAM | YES | Collection of identical MyISAM tables |
12| ISAM | NO | Obsolete storage engine |12 rows in set (0.00 sec)
標準安裝程序中只提供部分引擎的支持,如果需要使用其他的存儲引擎,需要使用源代碼加不同的參數(shù)重新編譯。其中DEFAULT表明系統(tǒng)的默認存儲引擎,可以通過修改配置參數(shù)來變更:
default-storage-engine=MyISAM
查看某個存儲引擎的具體信息
1mysql> show engine InnoDB status\G;
一般安裝系統(tǒng)默認是INNODB
default-storage-engine=INNODB
1.可以在啟動數(shù)據(jù)庫服務(wù)器時在命令行后面加上–default-storage-engine或–default-table-type選項。
2.更靈活的方式是在隨MySQL服務(wù)器發(fā)布同時提供的MySQL客戶端時指定使用的存儲引擎。最直接的方式是在創(chuàng)建表時指定存儲引擎的類型,向下面這樣:
1CREATE TABLE mytable (id int, titlechar(20)) ENGINE = INNODB
修改表的存儲引擎:
1ALTER TABLE engineTest ENGINE = INNODB;
修改默認存儲引擎:
在mysql配置文件(linux下為/etc/my.cnf),在mysqld后面增加default-storage-engine=INNODB即可。
但是如果表建立的時候是MyISAM,要更改整個數(shù)據(jù)庫表的存儲引擎,一般要一個表一個表的修改,比較繁瑣,可以采用先把數(shù)據(jù)庫導出,得到SQL,把MyISAM修改成INNODB,再導入的方式。