本節書摘來自華章出版社《mysql dba修煉之道》一書中的第1章,第1.6節,作者:陳曉勇,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
運作如下指令可檢視表的引擎。
其中,engine欄位表示使用的是何種引擎。
mysql不同于其他資料庫,它的存儲引擎是“可插拔”的,意思就是mysql server的核心基礎代碼和存儲引擎是分離的,你可以使用最适合應用的引擎,也就是說mysql支援不同的表使用不同的引擎。mysql擁有20多個引擎,下面介紹幾個常用的引擎。
1.6.1 innodb引擎
在mysql 5.5及以後的版本中,innodb是mysql的預設引擎,這些年來,innodb一直在持續改進,處理能力不斷提高,其優秀的性能和可維護性使它成為生産中普遍推薦使用的引擎。它的優點有:
災難恢複性好。
支援全部4種級别的事務。預設的事務隔離級别是可重複讀(repeatable read),它的事務支援是通過多版本并發控制(mvcc)來提供的。
使用行級鎖。
對于innodb引擎中的表,其資料的實體組織形式是簇表(cluster table),資料按主鍵來組織,也就是說主鍵索引和資料是在一起的,資料按主鍵的順序實體分布。資料表的另一種常見形式是非簇表,其索引是有序的,而資料是無序的。
實作了緩沖管理,不僅能緩沖索引也能緩沖資料,并且會自動建立散列索引以加快資料的擷取。相比之下,myisam隻是緩存了索引。
支援外鍵。
支援熱備份。
注意 若無特殊說明,本書都是基于innodb引擎論述的。
1.6.2 myisam引擎
myisam是mysql5.0/5.1的預設引擎,但mysql官方的重心早已不在myisam引擎上了,近些年來,myisam一直沒有大的改進,由于它有許多缺陷,如不支援事務、災難恢複性差,是以不建議在生産環境中使用。
以下是myisam的一些特性。
可以配合鎖,實作作業系統下的複制備份、遷移。
使用表級鎖,并發性差。
支援全文檢索(mysql inonodb在5.6以後也支援全文檢索)。
主機當機後,myisam表易損壞,災難恢複性不佳。
無事務支援。
隻緩存索引,資料的緩存是利用作業系統緩沖區來實作的。可能引發過多的系統調用且效率不佳。
資料緊湊存儲,是以可獲得更小的索引和更快的全表掃描性能。
1.6.3 memory存儲引擎
memory存儲引擎提供“記憶體”表,也不支援事務、外鍵。
使用記憶體表(記憶體引擎)可以顯著提高通路資料的速度,可用于緩存會頻繁通路的、可以重構的資料、計算結果、統計值、中間結果,但也有如下這些不足之處。
使用的是表級鎖,雖然記憶體通路快,但如果頻繁地讀寫,表級鎖可能會成為瓶頸
所在。
隻支援固定大小的行。varchar類型的字段會存儲為固定長度的char類型,浪費空間。
不支援text、blob字段。當有些查詢需要使用到臨時表(使用的也是memory存儲引擎)時如果表中有text、blob字段,那麼會轉化為基于磁盤的myisam表,嚴重降低性能。
由于記憶體資源成本昂貴,一般不建議設定過大的記憶體表,如果記憶體表滿了,就會在mysql錯誤日志裡發現類似“the table ‘table_name’ is full”這樣的錯誤,可通過清除資料或調整記憶體表參數來避免報錯。
伺服器重新開機後資料會丢失,複制維護時需要小心,具體請參考第12章。
1.6.4 archive存儲引擎
archive存儲引擎是被設計用來存儲企業中的大量流水資料的存儲引擎。archive引擎使用zlib無損資料壓縮,讓資料都儲存在壓縮的存檔表中。當資料被插入時,它們被壓縮。
它隻支援insert和select,支援自增鍵及其上的索引,不支援其他索引。它适合做日志記錄、使用者行為分析,不需要update、delete和索引的資料。
1.6.5 選擇合适的引擎
表1-1列舉了mysql部分引擎的特性:是否支援事務、鎖級别、是否支援熱備份。其中,5.0版本、5.1版本預設的引擎是myisam,5.5版本、5.6版本預設的引擎是innodb。

那麼如何選擇合适的引擎呢?以下是選擇引擎時需要考慮的一些因素。
是否需要事務支援。
是否為高并發,innodb實作了行鎖,這方面的表現大大優于myisam。
索引,不同存儲引擎的索引實作不盡相同。
是否需要外鍵。
高效緩沖資料,innodb緩沖資料而myisam隻緩沖了索引。
備份,是否需要支援熱備份。
我們可以靈活地選擇引擎,但是從維護的角度來說,維護統一的存儲引擎會更友善,是以或者全部是myisam,或者全部是innodb引擎在現實生産中更常見,也更易于管理。
1.6.6 選擇何種平台
業内普遍的做法是把mysql部署在linux系統下,是以如果不加特别說明,本書指的都是linux下的mysql部署、使用。為什麼網際網路公司的生産環境一般使用linux作業系統,而不考慮在windows上部署安裝mysql呢?部分原因如下所示。
一般來說,部署在unix/linux環境下的軟體程式往往有更高的運作效率。因為這樣一個事實:不同的作業系統在它們所采用的程序和線程模型方面有着相當大的差異。unix/linux程式設計模型對apache和mysql等軟體進行優化的工作不僅開始得最早,進行得也最全面徹底,而windows在這方面就遠遠落後了。
oracle公司在收購mysql後,對windows版本做了一些增強,這樣做更多的是出于商業的考慮,windows pc和windows server的市場占有率高,無論是作為開發環境或獨立軟體供應商的背景資料庫,windows下的mysql都有其巨大的商業價值,而且可以對ms sql server構成一定的威脅,但如果想要獲得更好的性能、更高的吞吐量,仍然隻有在linux平台上才能實作。