?簡介
MySQL數(shù)據(jù)庫主要的存儲引擎:?
MyISAM和InnoDB簡介
? ? ? MyISAM是MySQL的默認(rèn)數(shù)據(jù)庫引擎(5.5版之前),由早期的 ISAM (Indexed Sequential Access Method:有索引的順序訪問方法)所改良。雖然性能極佳,而且提供了大量的特性,包括全文索引、壓縮、空間函數(shù)等,但MyISAM不支持事務(wù)和行級鎖,而且最大的缺陷就是崩潰后無法安全恢復(fù)。
? ? ? 不過,5.5版本之后,MySQL引入了InnoDB(另一種數(shù)據(jù)庫引擎),以強(qiáng)化參考完整性與并發(fā)違規(guī)處理機(jī)制,后來就逐漸取代MyISAM。與傳統(tǒng)的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(wù)(Transaction)功能,類似于PostgreSQL。目前InnoDB采用雙軌制授權(quán),一是GPL授權(quán),另一是專有軟件授權(quán)。
? ? ? 現(xiàn)在大多數(shù)時候我們使用的都是InnoDB存儲引擎,但是在某些情況下使用MyISAM更好,比如:MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。?在數(shù)據(jù)庫做主從分離的情況下,經(jīng)常選擇MyISAM作為主庫的存儲引擎(最后一句有待驗(yàn)證,因?yàn)橹鲙熵?fù)責(zé)對外提供寫服務(wù),從庫對外提供讀服務(wù))。?
MyISAM特點(diǎn)
- 不支持行鎖(MyISAM只有表鎖),讀取時對需要讀到的所有表加鎖,寫入時則對表加排他鎖;
- 不支持事務(wù)
- 不支持外鍵
- 不支持崩潰后的安全恢復(fù)
- 在表有讀取查詢的同時,支持往表中插入新紀(jì)錄
- 支持BLOB和TEXT的前500個字符索引,支持全文索引
- 支持延遲更新索引,極大地提升了寫入性能
- 對于不會進(jìn)行修改的表,支持 壓縮表 ,極大地減少了磁盤空間的占用
補(bǔ)充概念:
Mysql的行鎖和表鎖( 鎖是計算機(jī)協(xié)調(diào)多個進(jìn)程或純線程并發(fā)訪問某一資源的機(jī)制)?
表級鎖: 每次操作鎖住整張表。開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低;?
行級鎖: 每次操作鎖住一行數(shù)據(jù)。開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高;
InnoDB特點(diǎn)
- 支持行鎖,采用MVCC來支持高并發(fā),有可能死鎖
- 支持事務(wù)
- 支持外鍵
- 支持崩潰后的安全恢復(fù)
- 不支持全文索引
二者的常見對比
- count運(yùn)算上的區(qū)別: 因?yàn)镸yISAM緩存有表meta-data(行數(shù)等),因此在做COUNT(*)時對于一個結(jié)構(gòu)很好的查詢是不需要消耗多少資源的。而對于InnoDB來說,則沒有這種緩存。
- 是否支持事務(wù)和崩潰后的安全恢復(fù): MyISAM 強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持。但是InnoDB 提供事務(wù)支持事務(wù),外部鍵等高級數(shù)據(jù)庫功能。 具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。
- 是否支持外鍵: MyISAM不支持,而InnoDB支持。
總之,MyISAM更適合讀密集的表,而InnoDB更適合寫密集的的表。一般來說,如果需要事務(wù)支持,并且有較高的并發(fā)讀取頻率(MyISAM的表鎖的粒度太大,所以當(dāng)該表寫并發(fā)量較高時,要等待的查詢就會很多了),InnoDB是不錯的選擇。如果你的數(shù)據(jù)量很大(MyISAM支持壓縮特性可以減少磁盤的空間占用),而且不需要支持事務(wù)MyISAM是最好的選擇。
?
MyISAM和InnoDB兩者之間具體區(qū)別如下:
簡單梳理如下:
1) 事務(wù)支持
MyISAM不支持事務(wù),而InnoDB支持。InnoDB的AUTOCOMMIT默認(rèn)是打開的,即每條SQL語句會默認(rèn)被封裝成一個事務(wù),自動提交,這樣會影響速度,所以最好是把多條SQL語句顯示放在begin和commit之間,組成一個事務(wù)去提交。
MyISAM是非事務(wù)安全型的,而InnoDB是事務(wù)安全型的,默認(rèn)開啟自動提交,宜合并事務(wù),一同提交,減小數(shù)據(jù)庫多次提交導(dǎo)致的開銷,大大提高性能。
2) 存儲結(jié)構(gòu)
MyISAM:每個MyISAM在磁盤上存儲成三個文件。第一個文件的名字以表的名字開始,擴(kuò)展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴(kuò)展名為.MYD (MYData)。索引文件的擴(kuò)展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一個數(shù)據(jù)文件中(也可能是多個文件,或者是獨(dú)立的表空間文件),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
3) 存儲空間
MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。
靜態(tài)表:表中的字段都是非變長字段,這樣每個記錄都是固定長度的,優(yōu)點(diǎn)存儲非常迅速,容易緩存,出現(xiàn)故障容易恢復(fù);缺點(diǎn)是占用的空間通常比動態(tài)表多(因?yàn)榇鎯r會按照列的寬度定義補(bǔ)足空格)ps:在取數(shù)據(jù)的時候,默認(rèn)會把字段后面的空格去掉,如果不注意會把數(shù)據(jù)本身帶的空格也會忽略。
動態(tài)表:記錄不是固定長度的,這樣存儲的優(yōu)點(diǎn)是占用的空間相對較少;缺點(diǎn):頻繁的更新、刪除數(shù)據(jù)容易產(chǎn)生碎片,需要定期執(zhí)行OPTIMIZE TABLE或者myisamchk-r命令來改善性能
壓縮表:因?yàn)槊總€記錄是被單獨(dú)壓縮的,所以只有非常小的訪問開支
參考:https://blog.csdn.net/qq_34417408/article/details/80957620
InnoDB:需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
4) 可移植性、備份及恢復(fù)
MyISAM:數(shù)據(jù)是以文件的形式存儲,所以在跨平臺的數(shù)據(jù)轉(zhuǎn)移中會很方便。在備份和恢復(fù)時可單獨(dú)針對某個表進(jìn)行操作。
InnoDB:免費(fèi)的方案可以是拷貝數(shù)據(jù)文件、備份 binlog,或者用 mysqldump,在數(shù)據(jù)量達(dá)到幾十G的時候就相對痛苦了。
5) 事務(wù)支持
MyISAM:強(qiáng)調(diào)的是性能,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持。
InnoDB:提供事務(wù)支持事務(wù),外部鍵等高級數(shù)據(jù)庫功能。 具有事務(wù)(commit)、回滾(rollback)和崩潰修復(fù)能力(crash recovery capabilities)的事務(wù)安全(transaction-safe (ACID compliant))型表。
6) AUTO_INCREMENT
MyISAM:可以和其他字段一起建立聯(lián)合索引。引擎的自動增長列必須是索引,如果是組合索引,自動增長可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。
InnoDB:InnoDB中必須包含只有該字段的索引。引擎的自動增長列必須是索引,如果是組合索引也必須是組合索引的第一列。
7) 表鎖差異
MyISAM:只支持表級鎖,用戶在操作myisam表時,select,update,delete,insert語句都會給表自動加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB:支持事務(wù)和行級鎖,是innodb的最大特色。行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的。
MyISAM鎖的粒度是表級,而InnoDB支持行級鎖定。簡單來說就是, InnoDB支持?jǐn)?shù)據(jù)行鎖定,而MyISAM不支持行鎖定,只支持鎖定整個表。即MyISAM同一個表上的讀鎖和寫鎖是互斥的,MyISAM并發(fā)讀寫時如果等待隊列中既有讀請求又有寫請求,默認(rèn)寫請求的優(yōu)先級高,即使讀請求先到,所以MyISAM不適合于有大量查詢和修改并存的情況,那樣查詢進(jìn)程會長時間阻塞。因?yàn)镸yISAM是鎖表,所以某項(xiàng)讀操作比較耗時會使其他寫進(jìn)程餓死。
8) 全文索引
MyISAM:支持(FULLTEXT類型的)全文索引
InnoDB:不支持(FULLTEXT類型的)全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。
全文索引是指對char、varchar和text中的每個詞(停用詞除外)建立倒排序索引。MyISAM的全文索引其實(shí)沒啥用,因?yàn)樗恢С种形姆衷~,必須由使用者分詞后加入空格再寫到數(shù)據(jù)表里,而且少于4個漢字的詞會和停用詞一樣被忽略掉。
另外,MyIsam索引和數(shù)據(jù)分離,InnoDB在一起,MyIsam天生非聚簇索引,最多有一個unique的性質(zhì),InnoDB的數(shù)據(jù)文件本身就是主鍵索引文件,這樣的索引被稱為“聚簇索引”
9) 表主鍵
MyISAM:允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB:如果沒有設(shè)定主鍵或者非空唯一索引,就會自動生成一個6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主鍵范圍更大,最大是MyISAM的2倍。
10) 表的具體行數(shù)
MyISAM:保存有表的總行數(shù),如果select count(*) from table;會直接取出出該值。
InnoDB:沒有保存表的總行數(shù)(只能遍歷),如果使用select count(*) from table;就會遍歷整個表,消耗相當(dāng)大,但是在加了wehre條件后,myisam和innodb處理的方式都一樣。
11) CURD操作
MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應(yīng)該使用InnoDB表。DELETE 從性能上InnoDB更優(yōu),但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數(shù)據(jù)的表,最好使用truncate table這個命令。
12) 外鍵
MyISAM:不支持
InnoDB:支持
13) 查詢效率
沒有where的count(*)使用MyISAM要比InnoDB快得多。因?yàn)镸yISAM內(nèi)置了一個計數(shù)器,count(*)時它直接從計數(shù)器中讀,而InnoDB必須掃描全表。
? ? ? ?所以在InnoDB上執(zhí)行count(*)時一般要伴隨where,且where中要包含主鍵以外的索引列。為什么這里特別強(qiáng)調(diào)“主鍵以外”?因?yàn)镮nnoDB中primary index是和raw data存放在一起的,而secondary index則是單獨(dú)存放,然后有個指針指向primary key。所以只是count(*)的話使用secondary index掃描更快,而primary key則主要在掃描索引同時要返回raw data時的作用較大。MyISAM相對簡單,所以在效率上要優(yōu)于InnoDB,小型應(yīng)用可以考慮使用MyISAM。
? ? ? ? 通過上述的分析,基本上可以考慮使用InnoDB來替代MyISAM引擎了,原因是InnoDB自身很多良好的特點(diǎn),比如事務(wù)支持、存儲 過程、視圖、行級鎖定等等,在并發(fā)很多的情況下,相信InnoDB的表現(xiàn)肯定要比MyISAM強(qiáng)很多。另外,任何一種表都不是萬能的,只用恰當(dāng)?shù)尼槍I(yè)務(wù)類型來選擇合適的表類型,才能最大的發(fā)揮MySQL的性能優(yōu)勢。如果不是很復(fù)雜的Web應(yīng)用,非關(guān)鍵應(yīng)用,還是可以繼續(xù)考慮MyISAM的,這個具體情況可以自己斟酌。
MyISAM和InnoDB兩者的應(yīng)用場景:
1) MyISAM管理非事務(wù)表。它提供高速存儲和檢索,以及全文搜索能力。如果應(yīng)用中需要執(zhí)行大量的SELECT查詢,那么MyISAM是更好的選擇。
2) InnoDB用于事務(wù)處理應(yīng)用程序,具有眾多特性,包括ACID事務(wù)支持。如果應(yīng)用中需要執(zhí)行大量的INSERT或UPDATE操作,則應(yīng)該使用InnoDB,這樣可以提高多用戶并發(fā)操作的性能。文章來源:http://www.zghlxwxcb.cn/news/detail-697665.html
但是實(shí)際場景中,針對具體問題需要具體分析,一般而言可以遵循以下幾個問題:
-? 數(shù)據(jù)庫是否有外鍵??
-? 是否需要事務(wù)支持??
-? 是否需要全文索引??
-? 數(shù)據(jù)庫經(jīng)常使用什么樣的查詢模式?在寫多讀少的應(yīng)用中還是Innodb插入性能更穩(wěn)定,在并發(fā)情況下也能基本,如果是對讀取速度要求比較快的應(yīng)用還是選MyISAM。?
-? 數(shù)據(jù)庫的數(shù)據(jù)有多大? 大尺寸傾向于innodb,因?yàn)槭聞?wù)日志,故障恢復(fù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-697665.html
到了這里,關(guān)于MySQL——存儲引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!