MySQL有多種存儲引擎,目前常用的是 MyISAM 和 InnoDB 這兩個引擎,除了這兩個引擎以外還有許多其他引擎,有官方的,也有一些公司自己研發的。這篇文章主要簡單概述一下常用常見的 MySQL 引擎,一則這是面試中常被問到的問題,二則這也是數據庫設計中不可忽略的問題,用合適的引擎可以更好的適應業務場景,提高業務效率。
MyISAM
MyISAM 是 mysql 5.5.5 之前的默認引擎,它支持 B-tree/FullText/R-tree 索引類型。
鎖級別爲表鎖,表鎖優點是開銷小,加鎖快;缺點是鎖粒度大,發生鎖衝動概率較高,容納併發能力低,這個引擎適合查詢爲主的業務。
此引擎不支持事務,也不支持外鍵。
MyISAM 強調了快速讀取操作。它存儲表的行數,於是 SELECT COUNT (*) FROM TABLE 時只需要直接讀取已經保存好的值而不需要進行全表掃描。
InnoDB
InnoDB 存儲引擎最大的亮點就是支持事務,支持回滾,它支持 Hash/B-tree 索引類型。
鎖級別爲行鎖,行鎖優點是適用於高併發的頻繁表修改,高併發是性能優於 MyISAM。缺點是系統消耗較大,索引不僅緩存自身,也緩存數據,相比 MyISAM 需要更大的內存。
InnoDB 中不保存表的具體行數,也就是說,執行 select count (*) from table 時,InnoDB 要掃描一遍整個表來計算有多少行。
支持事務,支持外鍵。
ACID 事務
A 事務的原子性 (Atomicity):指一個事務要麼全部執行,要麼不執行。也就是說一個事務不可能只執行了一半就停止了。比如你從取款機取錢,這個事務可以分成兩個步驟:1)劃卡,2)出錢。不可能劃了卡,而錢卻沒出來,這兩步必須同時完成,要麼就不完成。
C 事務的一致性 (Consistency):指事務的運行並不改變數據庫中數據的一致性。例如,完整性約束了 a+b=10,一個事務改變了 a,那麼 b 也應該隨之改變。
I 獨立性 (Isolation):事務的獨立性也有稱作隔離性,是指兩個以上的事務不會出現交錯執行的狀態。因爲這樣可能會導致數據不一致。
D 持久性 (Durability):事務的持久性是指事務執行成功以後,該事務所對數據庫所作的更改便是持久的保存在數據庫之中,不會無緣無故的回滾。
Memory
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 了。而業務真發展到一定程度時,自帶的存儲引擎無法滿足時,這時公司應該是有實力去自主研發滿足自己需求的存儲引擎或者購買商用的存儲引擎了。