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