??作者簡(jiǎn)介:小明java問道之路,2022年度博客之星全國(guó)TOP3,專注于后端、中間件、計(jì)算機(jī)底層、架構(gòu)設(shè)計(jì)演進(jìn)與穩(wěn)定性建設(shè)優(yōu)化,文章內(nèi)容兼具廣度、深度、大廠技術(shù)方案,對(duì)待技術(shù)喜歡推理加驗(yàn)證,就職于知名金融公司后端高級(jí)工程師。
? ? ? ??
?? 熱衷分享,喜歡原創(chuàng)~ 關(guān)注我會(huì)給你帶來(lái)一些不一樣的認(rèn)知和成長(zhǎng)。
? ? ? ??
?? 2022博客之星TOP3 | CSDN博客專家 | 后端領(lǐng)域優(yōu)質(zhì)創(chuàng)作者 | CSDN內(nèi)容合伙人
?? InfoQ(極客邦)簽約作者、阿里云專家 | 簽約博主、51CTO專家 | TOP紅人、華為云享專家
????????
??如果此文還不錯(cuò)的話,還請(qǐng)??關(guān)注、點(diǎn)贊、收藏三連支持??一下博主~?
?? 文末獲取聯(lián)系 ???????? 精彩專欄推薦訂閱收藏 ????
專欄系列(點(diǎn)擊解鎖)
學(xué)習(xí)路線(點(diǎn)擊解鎖)
知識(shí)定位
??Redis從入門到精通與實(shí)戰(zhàn)??
Redis從入門到精通與實(shí)戰(zhàn)
圍繞原理源碼講解Redis面試知識(shí)點(diǎn)與實(shí)戰(zhàn)
??MySQL從入門到精通??
MySQL從入門到精通
全面講解MySQL知識(shí)與企業(yè)級(jí)MySQL實(shí)戰(zhàn) ??計(jì)算機(jī)底層原理??
深入理解計(jì)算機(jī)系統(tǒng)CSAPP
以深入理解計(jì)算機(jī)系統(tǒng)為基石,構(gòu)件計(jì)算機(jī)體系和計(jì)算機(jī)思維
Linux內(nèi)核源碼解析
圍繞Linux內(nèi)核講解計(jì)算機(jī)底層原理與并發(fā)
??數(shù)據(jù)結(jié)構(gòu)與企業(yè)題庫(kù)精講??
數(shù)據(jù)結(jié)構(gòu)與企業(yè)題庫(kù)精講
結(jié)合工作經(jīng)驗(yàn)深入淺出,適合各層次,筆試面試算法題精講
??互聯(lián)網(wǎng)架構(gòu)分析與實(shí)戰(zhàn)??
企業(yè)系統(tǒng)架構(gòu)分析實(shí)踐與落地
行業(yè)最前沿視角,專注于技術(shù)架構(gòu)升級(jí)路線、架構(gòu)實(shí)踐
互聯(lián)網(wǎng)企業(yè)防資損實(shí)踐
互聯(lián)網(wǎng)金融公司的防資損方法論、代碼與實(shí)踐
??Java全棧白寶書??
精通Java8與函數(shù)式編程
本專欄以實(shí)戰(zhàn)為基礎(chǔ),逐步深入Java8以及未來(lái)的編程模式
深入理解JVM
詳細(xì)介紹內(nèi)存區(qū)域、字節(jié)碼、方法底層,類加載和GC等知識(shí)
深入理解高并發(fā)編程
深入Liunx內(nèi)核、匯編、C++全方位理解并發(fā)編程
Spring源碼分析
Spring核心七IOC/AOP等源碼分析
MyBatis源碼分析
MyBatis核心源碼分析
Java核心技術(shù)
只講Java核心技術(shù)
本文目錄
本文導(dǎo)讀
一、InnoDB支持事務(wù),MyISAM不支持
二、 存儲(chǔ)結(jié)構(gòu)不同
三、存儲(chǔ)空間不同
四、InnoDB支持行級(jí)鎖,MyISAM 僅支持表級(jí)鎖
五、count()函數(shù)不同
六、索引不同
1、MyISAM允許沒有主鍵
2、InnoDB支持外鍵
3、InnoDB聚簇索引,MyISAM非聚簇索引
4、InnoDB表唯一索引必選
5、InnoDB不支持全文索引
6、索引保存位置不同
7、自增(AUTO_INCREMENT)
七、如何選擇存儲(chǔ)引擎?
八、InnoDB為什么推薦使用自增ID作為主鍵?
九、為什么InnoDB沒有了count變量?
總結(jié)
本文導(dǎo)讀
文本適合解決:你們公司用什么存儲(chǔ)引擎?InnoDB和MyISAM 區(qū)別?為什么選擇InnoDB?什么事聚簇索引什么是非聚簇索引?InnoDB如何存儲(chǔ)數(shù)據(jù)?如何選擇存儲(chǔ)引擎?InnoDB為什么推薦用自增ID做主鍵?等類似的問題。
一、InnoDB支持事務(wù),MyISAM不支持
InnoDB支持事務(wù),MyISAM不支持。
MyISAM 強(qiáng)調(diào)的是性能,每次查詢具有原子性。其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務(wù)支持)。MyISAM 默認(rèn)表類型,它是基于傳統(tǒng)的ISAM類型,它是存儲(chǔ)記錄和文件的標(biāo)準(zhǔn)方法。不是事務(wù)安全的,而且不支持外鍵。
InnoDB支持事務(wù),支持外鍵、行鎖、事務(wù)是他的最大特點(diǎn),對(duì)于InnoDB每一條SQL語(yǔ)言都默認(rèn)封裝成事務(wù),自動(dòng)提交,這樣會(huì)影響速度,所以最好把多條SQL語(yǔ)言放在begin和commit之間,組成一個(gè)事務(wù)。
二、 存儲(chǔ)結(jié)構(gòu)不同
MyISAM 數(shù)據(jù)和索引是分別存儲(chǔ)的,數(shù)據(jù)文件的擴(kuò)展名為(.MYD)。索引文件的擴(kuò)展名是(.MYI)。
InnoDB 數(shù)據(jù)和索引是集中存儲(chǔ)的(.ibd),InnoDB表的大小只受限于操作系統(tǒng)文件的大小,一般為2GB。
三、存儲(chǔ)空間不同
MyISAM 可被壓縮,存儲(chǔ)空間較小。支持三種不同的存儲(chǔ)格式:靜態(tài)表(默認(rèn),但是注意數(shù)據(jù)末尾不能有空格,會(huì)被去掉)、動(dòng)態(tài)表、壓縮表。
InnoDB 需要更多的內(nèi)存和存儲(chǔ),它會(huì)在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
四、InnoDB支持行級(jí)鎖,MyISAM 僅支持表級(jí)鎖
MyISAM 只支持表級(jí)鎖,用戶在操作MyISAM 表時(shí),select,update,delete,insert語(yǔ)句都會(huì)給表自動(dòng)加鎖,如果加鎖以后的表滿足insert并發(fā)的情況下,可以在表的尾部插入新的數(shù)據(jù)。
InnoDB支持事務(wù)和行級(jí)鎖,行鎖大幅度提高了多用戶并發(fā)操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會(huì)鎖全表的。
MySQL InnoDB引擎默認(rèn)的修改數(shù)據(jù)語(yǔ)句,update、delete、insert都會(huì)自動(dòng)給涉及到的數(shù)據(jù)加上排他鎖,select語(yǔ)句默認(rèn)不會(huì)加任何鎖類型,如果加排他鎖可以使用select …for update(不希望別的事務(wù)修改數(shù)據(jù),其他的事務(wù)職能用不帶鎖的select來(lái)查詢),加共享鎖可以使用 select … lock in share mode語(yǔ)句(或者select不帶任何鎖來(lái)查詢數(shù)據(jù))
五、count()函數(shù)不同
MyISAM 保存有表的總行數(shù),如果select count(*) from table;會(huì)直接取出出該值。
InnoDB 沒有保存表的總行數(shù),如果使用select count(*) from table;就會(huì)遍歷整個(gè)表,消耗相當(dāng)大,但是在加了wehre條件后,MyISAM 和InnoDB處理的方式都一樣。
六、索引不同
1、InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
2、InnoDB的主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)的是行數(shù)據(jù),因此主鍵索引非常高效。
3、MyISAM索引的葉子節(jié)點(diǎn)存儲(chǔ)的是行數(shù)據(jù)地址,需要一次尋址的操作才能獲取到數(shù)據(jù)。
4、InnoDB非主鍵索引的葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵和其他帶索引的數(shù)據(jù),因此查詢是用索引覆蓋會(huì)更高效。?
1、MyISAM允許沒有主鍵
MyISAM 允許沒有任何索引和主鍵的表存在,索引都是保存行的地址。
InnoDB 如果沒有設(shè)定主鍵或者非空唯一索引,就會(huì)自動(dòng)生成一個(gè)6字節(jié)的主鍵(用戶不可見),數(shù)據(jù)是主索引的一部分,附加索引保存的是主索引的值。
2、InnoDB支持外鍵
InnoDB支持外鍵,而MyISAM 不支持。對(duì)一個(gè)包含外鍵的InnoDB表轉(zhuǎn)為MYISAM會(huì)失?。?
3、InnoDB聚簇索引,MyISAM非聚簇索引
InnoDB是聚簇索引,使用B+Tree作為索引結(jié)構(gòu),數(shù)據(jù)文件是和(主鍵)索引綁在一起的(表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu)),必須要有主鍵,通過(guò)主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過(guò)主鍵查詢到數(shù)據(jù)。因此,主鍵不應(yīng)該過(guò)大,因?yàn)橹麈I太大,其他索引也都會(huì)很大。
MyISAM是非聚簇索引,也是使用B+Tree作為索引結(jié)構(gòu),索引和數(shù)據(jù)文件是分離的,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的。
InnoDB的B+樹主鍵索引的葉子節(jié)點(diǎn)就是數(shù)據(jù)文件,輔助索引的葉子節(jié)點(diǎn)是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節(jié)點(diǎn)都是數(shù)據(jù)文件的地址指針。
MyISAM 這棵樹的葉子結(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)是物理地址,InnoDB的葉子結(jié)點(diǎn)直接存儲(chǔ)數(shù)據(jù)記錄,這也是簇索引與非簇索引的區(qū)別。
4、InnoDB表唯一索引必選
InnoDB表唯一索引必選,MyISAM 可以選;InnoDB表沒有指定的話會(huì)自己找/生產(chǎn)一個(gè)隱藏列Row_id來(lái)充當(dāng)默認(rèn)主鍵,而MyISAM 可以沒有
5、InnoDB不支持全文索引
InnoDB不支持fulltext全文索引,MyISAM支持;InnoDB不支持FULLTEXT類型的全文索引,但是InnoDB可以使用sphinx插件支持全文索引,并且效果更好。
6、索引保存位置不同
MyISAM 的索引以表名+.MYI文件分別保存。
InnoDB的索引和數(shù)據(jù)一起保存在表空間里。
7、自增(AUTO_INCREMENT)
MyISAM 引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引,自動(dòng)增長(zhǎng)可以不是第一列,他可以根據(jù)前面幾列進(jìn)行排序后遞增。
InnoDB引擎的自動(dòng)增長(zhǎng)列必須是索引,如果是組合索引也必須是組合索引的第一列。
七、如何選擇存儲(chǔ)引擎?
1. 是否要支持事務(wù),如果要請(qǐng)選擇InnoDB,如果不需要可以考慮MyISAM;
2. 如果表中絕大多數(shù)都只是讀查詢,可以考慮MyISAM,如果既有讀也有寫,請(qǐng)使用InnoDB。
3. 系統(tǒng)奔潰后,MyISAM恢復(fù)起來(lái)更困難,能否接受;
4. MySQL5.5版本開始InnoDB已經(jīng)成為MySQL的默認(rèn)引擎(之前是MyISAM),說(shuō)明其優(yōu)勢(shì)是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不會(huì)差。
八、InnoDB為什么推薦使用自增ID作為主鍵?
自增ID可以保證每次插入時(shí)B+索引是從右邊擴(kuò)展的,可以避免B+樹和頻繁合并和分裂(對(duì)比使用UUID)。如果使用字符串主鍵和隨機(jī)主鍵,會(huì)使得數(shù)據(jù)隨機(jī)插入,效率比較差。
九、為什么InnoDB沒有了count變量?
因?yàn)镮nnoDB的事務(wù)特性,在同一時(shí)刻表中的行數(shù)對(duì)于不同的事務(wù)而言是不一樣的,因此count統(tǒng)計(jì)會(huì)計(jì)算對(duì)于當(dāng)前事務(wù)而言可以統(tǒng)計(jì)到的行數(shù),而不是將總行數(shù)儲(chǔ)存起來(lái)方便快速查詢。
InnoDB會(huì)嘗試遍歷一個(gè)盡可能小的索引除非優(yōu)化器提示使用別的索引。如果二級(jí)索引不存在,InnoDB還會(huì)嘗試去遍歷其他聚簇索引。
如果索引并沒有完全處于InnoDB維護(hù)的緩沖區(qū)(Buffer Pool)中,count操作會(huì)比較費(fèi)時(shí)。可以建立一個(gè)記錄總行數(shù)的表并讓你的程序在INSERT/DELETE時(shí)更新對(duì)應(yīng)的數(shù)據(jù)。和上面提到的問題一樣,如果此時(shí)存在多個(gè)事務(wù)的話這種方案也不太好用。如果得到大致的行數(shù)值已經(jīng)足夠滿足需求可以嘗試SHOW TABLE STATUS文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-772366.html
總結(jié)
MyISAM是存儲(chǔ)記錄和文件的標(biāo)準(zhǔn)方法。不是事務(wù)安全的,而且不支持外鍵。InnoDB支持事務(wù)安全的引擎,支持事務(wù)、外鍵、索引、行鎖是他的最大特點(diǎn)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-772366.html
到了這里,關(guān)于【MySQL】InnoDB和MyISAM區(qū)別詳解(MySQL專欄啟動(dòng))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!