原文連接:https://www.cnblogs.com/yuxiuyan/p/6511837.htmlhtml
簡單來講,存儲引擎就是指表的類型以及表在計算機上的存儲方式。數據庫
存儲引擎的概念是MySQL的特色,Oracle中沒有專門的存儲引擎的概念,Oracle有OLTP和OLAP模式的區分。不一樣的存儲引擎決定了MySQL數據庫中的表能夠用不一樣的方式來存儲。咱們能夠根據數據的特色來選擇不一樣的存儲引擎。安全
在MySQL中的存儲引擎有不少種,能夠經過「SHOW ENGINES」語句來查看。下面重點關注InnoDB、MyISAM、MEMORY這三種。服務器
一.InnoDB存儲引擎 併發
InnoDB給MySQL的表提供了事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全。在MySQL從3.23.34a開始包含InnnoDB。它是MySQL上第一個提供外鍵約束的表引擎。並且InnoDB對事務處理的能力,也是其餘存儲引擎不能比擬的。靠後版本的MySQL的默認存儲引擎就是InnoDB。工具
InnoDB存儲引擎總支持AUTO_INCREMENT。自動增加列的值不能爲空,而且值必須惟一。MySQL中規定自增列必須爲主鍵。在插入值的時候,若是自動增加列不輸入值,則插入的值爲自動增加後的值;若是輸入的值爲0或空(NULL),則插入的值也是自動增加後的值;若是插入某個肯定的值,且該值在前面沒有出現過,就能夠直接插入。htm
InnoDB還支持外鍵(FOREIGN KEY)。外鍵所在的表叫作子表,外鍵所依賴(REFERENCES)的表叫作父表。父表中被字表外鍵關聯的字段必須爲主鍵。當刪除、更新父表中的某條信息時,子表也必須有相應的改變,這是數據庫的參照完整性規則。blog
InnoDB中,建立的表的表結構存儲在.frm文件中(我以爲是frame的縮寫吧)。數據和索引存儲在innodb_data_home_dir和innodb_data_file_path定義的表空間中。索引
InnoDB的優點在於提供了良好的事務處理、崩潰修復能力和併發控制。缺點是讀寫效率較差,佔用的數據空間相對較大。生命週期
二.MyISAM存儲引擎
MyISAM是MySQL中常見的存儲引擎,曾經是MySQL的默認存儲引擎。MyISAM是基於ISAM引擎發展起來的,增長了許多有用的擴展。
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)。
MyISAM:插入數據快,空間和內存使用比較低。若是表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。若是應用的完整性、併發性要求比 較低,也可使用。
MEMORY:全部的數據都在內存中,數據的處理速度快,可是安全性不高。若是須要很快的讀寫速度,對數據的安全性要求較低,能夠選擇MEMOEY。它對錶的大小有要求,不能創建太大的表。因此,這類數據庫只使用在相對較小的數據庫表。
注意,同一個數據庫也可使用多種存儲引擎的表。若是一個表要求比較高的事務處理,能夠選擇InnoDB。這個數據庫中能夠將查詢要求比較高的表選擇MyISAM存儲。若是該數據庫須要一個用於查詢的臨時表,能夠選擇MEMORY存儲引擎。