MySQL 的存儲(chǔ)引擎是插件式的,不同的存儲(chǔ)引擎有不同的鎖機(jī)制,其中我們最常到的兩個(gè)存儲(chǔ)引擎為 MyISAM 與 InnoDB。
???MyISAM 與 InnoDB的區(qū)別:
?MyISAM:
不支持事務(wù),但是每次查詢(xún)都是原子的;
支持表級(jí)鎖,即每次操作是對(duì)整個(gè)表加鎖;????
存儲(chǔ)表的總行數(shù);
一個(gè) MYISAM 表有三個(gè)文件:索引文件、表結(jié)構(gòu)文件、數(shù)據(jù)文件;
采用菲聚集索引,索引文件的數(shù)據(jù)域存儲(chǔ)指向數(shù)據(jù)文件的指針。輔索引與主索引?基本一致,但是輔索引不用保證唯一性。?
????InnoDB:?
支持 ACID 的事務(wù),支持事務(wù)的四種隔離級(jí)別;
支持行級(jí)鎖及外鍵約束:因此可以支持寫(xiě)并發(fā);
不存儲(chǔ)總行數(shù):一個(gè) InnoDb 引擎存儲(chǔ)在一個(gè)文件空間(共享表空間,表大小不受操作系統(tǒng)控制,一個(gè)表可能分布在多個(gè)文件里),也有可能為多個(gè)(設(shè)置為獨(dú)立表空,表大小受操作系統(tǒng)文件大小限制,一般為 2G),受操作系統(tǒng)文件大小的限制;
主鍵索引采用聚集索引(索引的數(shù)據(jù)域存儲(chǔ)數(shù)據(jù)文件本身),輔索引的數(shù)據(jù)域存儲(chǔ)主鍵的值;因此從輔索引查找數(shù)據(jù),需要先通過(guò)輔索引找到主鍵值,再訪問(wèn)輔索引;最好使用自增主鍵,防止插入數(shù)據(jù)時(shí),為維持 B+樹(shù)結(jié)構(gòu),文件的大調(diào)整。
? ??下面這個(gè)圖可能更直觀些:
MyISAM 與 InnoDB的索引實(shí)現(xiàn):
????????MyISAM 的索引是非聚簇索引。索引文件和數(shù)據(jù)文件是分離的,底層是B+樹(shù)作為索引結(jié)構(gòu),葉子節(jié)點(diǎn)data存放的是數(shù)據(jù)記錄指針的地址,這種索引結(jié)構(gòu)為非聚簇索引。
????????myisam中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。結(jié)構(gòu)如下圖:
????????InnoDB 的索引是聚簇索引。與MyISAM 的區(qū)別就是InnoDB的數(shù)據(jù)文件就是索引文件,葉子節(jié)點(diǎn)data存放的是數(shù)據(jù)的整條記錄。這種索引結(jié)構(gòu)為聚簇索引。
結(jié)構(gòu)如下圖:
????????因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有)
如果我們定義了主鍵(PRIMARY KEY),那么InnoDB會(huì)選擇其作為聚集索引。
如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵
如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。(隱含字段)
MyISAM 與 InnoDB的區(qū)別適用場(chǎng)景:
MyISAM 適合的場(chǎng)景為:
需要頻繁執(zhí)行全表 count 語(yǔ)句
對(duì)數(shù)據(jù)進(jìn)行增刪改的頻率不高,查詢(xún)非常頻繁
沒(méi)有事務(wù)
MyISAM 使用的索引是非聚簇索引
InnoDB 適合的場(chǎng)景為:
數(shù)據(jù)增刪改查都比較頻繁
可靠性要求高,需要支持事務(wù)
使用聚簇索引
……………分割線……………
不積跬步,無(wú)以至千里;不積小流,無(wú)以成江海。
關(guān)注我,每天分享一些小知識(shí)點(diǎn)。分享自己的小心得,包含但不限于初、中、高級(jí)面試題呦!!!
我都墨跡這么半天了 ,你不點(diǎn)關(guān)注,不點(diǎn)贊,不收藏,還不轉(zhuǎn)發(fā),你想干啥!!!!