淺談MySQL存儲(chǔ)引擎


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ā),你想干啥!!!!


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容