MySQL 有多種存儲引擎,目前經常使用的是 MyISAM 和 InnoDB 這兩個引擎,除了這兩個引擎覺得還有許多其餘引擎,有官方的,也有一些公司本身研發的。這篇文章主要簡單概述一下經常使用常見的 MySQL 引擎,一則這是面試中常被問到的問題,二則這也是數據庫設計中不可忽略的問題,用合適的引擎能夠更好的適應業務場景,提升業務效率。mysql
MyISAM 是 MySQL 5.5.5 以前的默認引擎,它支持 B-tree/FullText/R-tree 索引類型。面試
鎖級別爲表鎖,表鎖優勢是開銷小,加鎖快;缺點是鎖粒度大,發生鎖衝動機率較高,容納併發能力低,這個引擎適合查詢爲主的業務。sql
此引擎不支持事務,也不支持外鍵。數據庫
MyISAM強調了快速讀取操做。它存儲表的行數,因而SELECT COUNT(*) FROM TABLE時只須要直接讀取已經保存好的值而不須要進行全表掃描。緩存
InnoDB 存儲引擎最大的亮點就是支持事務,支持回滾,它支持 Hash/B-tree 索引類型。安全
鎖級別爲行鎖,行鎖優勢是適用於高併發的頻繁表修改,高併發是性能優於 MyISAM。缺點是系統消耗較大,索引不只緩存自身,也緩存數據,相比 MyISAM 須要更大的內存。併發
InnoDB 中不保存表的具體行數,也就是說,執行 select count(*) from table時,InnoDB 要掃描一遍整個表來計算有多少行。數據庫設計
支持事務,支持外鍵。高併發
A 事務的原子性(Atomicity):指一個事務要麼所有執行,要麼不執行。也就是說一個事務不可能只執行了一半就中止了。好比你從取款機取錢,這個事務能夠分紅兩個步驟:1)劃卡,2)出錢。不可能劃了卡,而錢卻沒出來,這兩步必須同時完成,要麼就不完成。
C 事務的一致性(Consistency):指事務的運行並不改變數據庫中數據的一致性。例如,完整性約束了a+b=10,一個事務改變了a,那麼b也應該隨之改變。
I 獨立性(Isolation):事務的獨立性也有稱做隔離性,是指兩個以上的事務不會出現交錯執行的狀態。由於這樣可能會致使數據不一致。
D 持久性(Durability):事務的持久性是指事務執行成功之後,該事務所對數據庫所做的更改即是持久的保存在數據庫之中,不會平白無故的回滾。性能
Memory 是內存級別存儲引擎,數據存儲在內存中,因此他可以存儲的數據量較小。
由於內存的特性,存儲引擎對數據的一致性支持較差。鎖級別爲表鎖,不支持事務。但訪問速度很是快,而且默認使用 hash 索引。
Memory存儲引擎使用存在內存中的內容來建立表,每一個Memory表只實際對應一個磁盤文件,在磁盤中表現爲.frm文件。
MyISAM | InnoDB | |
---|---|---|
存儲結構 | 每張表被存放在三個文件:frm-格定義MYD(MYData)-數據文件MYI(MYIndex)-索引文件 | 全部的表都保存在同一個數據文件中(也多是多個文件,或者是獨立的表空間文件),InnoDB表的大小隻受限於操做系統文件的大小,通常爲2GB |
存儲空間 | MyISAM可被壓縮,存儲空間較小 | InnoDB的表須要更多的內存和存儲,它會在主內存中創建其專用的緩衝池用於高速緩衝數據和索引 |
可移植性、備份及恢復 | 因爲MyISAM的數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操做 | 免費的方案能夠是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了 |
事務安全 | 不支持 每次查詢具備原子性 | 支持 具備事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表 |
AUTO_INCREMENT | MyISAM表能夠和其餘字段一塊兒創建聯合索引 | InnoDB中必須包含只有該字段的索引 |
SELECT | MyISAM更優 | |
INSERT | InnoDB更優 | |
UPDATE | InnoDB更優 | |
DELETE | InnoDB更優 它不會從新創建表,而是一行一行的刪除 | |
COUNT without WHERE | MyISAM更優。由於MyISAM保存了表的具體行數 | InnoDB沒有保存表的具體行數,須要逐行掃描統計,就很慢了 |
COUNT with WHERE | 同樣 | 同樣,InnoDB也會鎖表 |
鎖 | 只支持表鎖 | 支持表鎖、行鎖 行鎖大幅度提升了多用戶併發操做的新能。可是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的 |
外鍵 | 不支持 | 支持 |
FULLTEXT全文索引 | 支持 | 不支持(5.6.4以上支持英文全文索引) 能夠經過使用Sphinx從InnoDB中得到全文索引,會慢一點 |
互聯網項目中隨着硬件成本的下降及緩存、中間件的應用,通常咱們選擇都以 InnoDB 存儲引擎爲主,不多再去選擇 MyISAM 了。而業務真發展的必定程度時,自帶的存儲引擎沒法知足時,這時公司應該是有實力去自主研發知足本身需求的存儲引擎或者購買商用的存儲引擎了。