<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          蝦皮二面:MySQL 支持哪些存儲(chǔ)引擎?MyISAM 和 InnoDB 的區(qū)別是什么?

          共 3799字,需瀏覽 8分鐘

           ·

          2022-05-15 13:32


          你好,我是 Guide。分享一道群友面試蝦皮遇到的 MySQL 面試真題。原面試題如下:

          1. MySQL 支持哪些存儲(chǔ)引擎?如何查看?默認(rèn)使用哪個(gè)?
          2. 存儲(chǔ)引擎基于數(shù)據(jù)庫(kù)還是表?
          3. MyISAM 和 InnoDB 的區(qū)別是什么?如何選擇?

          昨天抽了一晚上對(duì)這些問(wèn)題進(jìn)行了解答,希望對(duì)準(zhǔn)備面試以及 MySQL 復(fù)習(xí)知識(shí)點(diǎn)的小伙伴有幫助。

          馬上秋招就來(lái)了,最近一直在抽時(shí)間更新面試真題(原創(chuàng)不易,有幫助的話,點(diǎn)贊分享就是對(duì) Guide 最大的鼓勵(lì)):

          MySQL 核心在于存儲(chǔ)引擎,想要深入學(xué)習(xí) MySQL,必定要深入研究 MySQL 存儲(chǔ)引擎。

          MySQL 支持哪些存儲(chǔ)引擎?默認(rèn)使用哪個(gè)?

          MySQL 支持多種存儲(chǔ)引擎,你可以通過(guò) show engines 命令來(lái)查看 MySQL 支持的所有存儲(chǔ)引擎。

          查看 MySQL 提供的所有存儲(chǔ)引擎

          從上圖我們可以查看出, MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎是 InnoDB。并且,所有的存儲(chǔ)引擎中只有 InnoDB 是事務(wù)性存儲(chǔ)引擎,也就是說(shuō)只有 InnoDB 支持事務(wù)。

          我這里使用的 MySQL 版本是 8.x,不同的 MySQL 版本之間可能會(huì)有差別。

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認(rèn)存儲(chǔ)引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認(rèn)存儲(chǔ)引擎。

          你可以通過(guò) select version() 命令查看你的 MySQL 版本。

          ?mysql>?select?version();
          +-----------+
          |?version()?|
          +-----------+
          |?8.0.27????|
          +-----------+
          1?row?in?set?(0.00?sec)

          你也可以通過(guò) show variables like '%storage_engine%' 命令直接查看 MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎。

          查看 MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎

          如果你只想查看數(shù)據(jù)庫(kù)中某個(gè)表使用的存儲(chǔ)引擎的話,可以使用 show table status from db_name where name='table_name'命令。

          查看表的存儲(chǔ)引擎

          如果你想要深入了解每個(gè)存儲(chǔ)引擎以及它們之間的區(qū)別,推薦你去閱讀以下 MySQL 官方文檔對(duì)應(yīng)的介紹(面試不會(huì)問(wèn)這么細(xì),了解即可):

          • InnoDB 存儲(chǔ)引擎詳細(xì)介紹:https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html 。
          • 其他存儲(chǔ)引擎詳細(xì)介紹:https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html 。

          MySQL 存儲(chǔ)引擎架構(gòu)了解嗎?

          MySQL 存儲(chǔ)引擎采用的是插件式架構(gòu),支持多種存儲(chǔ)引擎,我們甚至可以為不同的數(shù)據(jù)庫(kù)表設(shè)置不同的存儲(chǔ)引擎以適應(yīng)不同場(chǎng)景的需要。存儲(chǔ)引擎是基于表的,而不是數(shù)據(jù)庫(kù)。

          并且,你還可以根據(jù) MySQL 定義的存儲(chǔ)引擎實(shí)現(xiàn)標(biāo)準(zhǔn)接口來(lái)編寫(xiě)一個(gè)屬于自己的存儲(chǔ)引擎。這些非官方提供的存儲(chǔ)引擎可以稱(chēng)為第三方存儲(chǔ)引擎,區(qū)別于官方存儲(chǔ)引擎。像目前最常用的 InnoDB 其實(shí)剛開(kāi)始就是一個(gè)第三方存儲(chǔ)引擎,后面由于過(guò)于優(yōu)秀,其被 Oracle 直接收購(gòu)了。

          MySQL 官方文檔也有介紹到如何編寫(xiě)一個(gè)自定義存儲(chǔ)引擎,地址:https://dev.mysql.com/doc/internals/en/custom-engine.html 。

          MyISAM 和 InnoDB 的區(qū)別是什么?

          MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默認(rèn)存儲(chǔ)引擎,可謂是風(fēng)光一時(shí)。

          雖然,MyISAM 的性能還行,各種特性也還不錯(cuò)(比如全文索引、壓縮、空間函數(shù)等)。但是,MyISAM 不支持事務(wù)和行級(jí)鎖,而且最大的缺陷就是崩潰后無(wú)法安全恢復(fù)。

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認(rèn)存儲(chǔ)引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認(rèn)存儲(chǔ)引擎。

          言歸正傳!咱們下面還是來(lái)簡(jiǎn)單對(duì)比一下兩者:

          1.是否支持行級(jí)鎖

          MyISAM 只有表級(jí)鎖(table-level locking),而 InnoDB 支持行級(jí)鎖(row-level locking)和表級(jí)鎖,默認(rèn)為行級(jí)鎖。

          也就說(shuō),MyISAM 一鎖就是鎖住了整張表,這在并發(fā)寫(xiě)的情況下是多么滴憨憨啊!這也是為什么 InnoDB 在并發(fā)寫(xiě)的時(shí)候,性能更牛皮了!

          2.是否支持事務(wù)

          MyISAM 不提供事務(wù)支持。

          InnoDB 提供事務(wù)支持,實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別,具有提交(commit)和回滾(rollback)事務(wù)的能力。并且,InnoDB 默認(rèn)使用的 REPEATABLE-READ(可重讀)隔離級(jí)別是可以解決幻讀問(wèn)題發(fā)生的(基于 MVCC 和 Next-Key Lock)。

          關(guān)于 MySQL 事務(wù)的詳細(xì)介紹,可以看看我寫(xiě)的這篇文章:MySQL 事務(wù)隔離級(jí)別詳解[1]

          3.是否支持外鍵

          MyISAM 不支持,而 InnoDB 支持。

          外鍵對(duì)于維護(hù)數(shù)據(jù)一致性非常有幫助,但是對(duì)性能有一定的損耗。因此,通常情況下,我們是不建議在實(shí)際生產(chǎn)項(xiàng)目中使用外鍵的,在業(yè)務(wù)代碼中進(jìn)行約束即可!

          阿里的《Java 開(kāi)發(fā)手冊(cè)》也是明確規(guī)定禁止使用外鍵的。

          不過(guò),在代碼中進(jìn)行約束的話,對(duì)程序員的能力要求更高,具體是否要采用外鍵還是要根據(jù)你的項(xiàng)目實(shí)際情況而定。

          總結(jié):一般我們也是不建議在數(shù)據(jù)庫(kù)層面使用外鍵的,應(yīng)用層面可以解決。不過(guò),這樣會(huì)對(duì)數(shù)據(jù)的一致性造成威脅。具體要不要使用外鍵還是要根據(jù)你的項(xiàng)目來(lái)決定。

          4.是否支持?jǐn)?shù)據(jù)庫(kù)異常崩潰后的安全恢復(fù)

          MyISAM 不支持,而 InnoDB 支持。

          使用 InnoDB 的數(shù)據(jù)庫(kù)在異常崩潰后,數(shù)據(jù)庫(kù)重新啟動(dòng)的時(shí)候會(huì)保證數(shù)據(jù)庫(kù)恢復(fù)到崩潰前的狀態(tài)。這個(gè)恢復(fù)的過(guò)程依賴(lài)于 redo log

          5.是否支持 MVCC

          MyISAM 不支持,而 InnoDB 支持。

          講真,這個(gè)對(duì)比有點(diǎn)廢話,畢竟 MyISAM 連行級(jí)鎖都不支持。MVCC 可以看作是行級(jí)鎖的一個(gè)升級(jí),可以有效減少加鎖操作,提高性能。

          6.索引實(shí)現(xiàn)不一樣。

          雖然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作為索引結(jié)構(gòu),但是兩者的實(shí)現(xiàn)方式不太一樣。

          InnoDB 引擎中,其數(shù)據(jù)文件本身就是索引文件。相比 MyISAM,索引文件和數(shù)據(jù)文件是分離的,其表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個(gè)索引結(jié)構(gòu),樹(shù)的葉節(jié)點(diǎn) data 域保存了完整的數(shù)據(jù)記錄。

          詳細(xì)區(qū)別,推薦你看看我寫(xiě)的這篇文章:MySQL 索引詳解[2]

          MyISAM 和 InnoDB 如何選擇?

          大多數(shù)時(shí)候我們使用的都是 InnoDB 存儲(chǔ)引擎,在某些讀密集的情況下,使用 MyISAM 也是合適的。不過(guò),前提是你的項(xiàng)目不介意 MyISAM 不支持事務(wù)、崩潰恢復(fù)等缺點(diǎn)(可是~我們一般都會(huì)介意啊!)。

          《MySQL 高性能》上面有一句話這樣寫(xiě)到:

          不要輕易相信“MyISAM 比 InnoDB 快”之類(lèi)的經(jīng)驗(yàn)之談,這個(gè)結(jié)論往往不是絕對(duì)的。在很多我們已知場(chǎng)景中,InnoDB 的速度都可以讓 MyISAM 望塵莫及,尤其是用到了聚簇索引,或者需要訪問(wèn)的數(shù)據(jù)都可以放入內(nèi)存的應(yīng)用。

          一般情況下我們選擇 InnoDB 都是沒(méi)有問(wèn)題的,但是某些情況下你并不在乎可擴(kuò)展能力和并發(fā)能力,也不需要事務(wù)支持,也不在乎崩潰后的安全恢復(fù)問(wèn)題的話,選擇 MyISAM 也是一個(gè)不錯(cuò)的選擇。但是一般情況下,我們都是需要考慮到這些問(wèn)題的。

          因此,對(duì)于咱們?nèi)粘i_(kāi)發(fā)的業(yè)務(wù)系統(tǒng)來(lái)說(shuō),你幾乎找不到什么理由再使用 MyISAM 作為自己的 MySQL 數(shù)據(jù)庫(kù)的存儲(chǔ)引擎。

          參考資料

          [1]

          MySQL 事務(wù)隔離級(jí)別詳解: https://javaguide.cn/database/mysql/transaction-isolation-level.html

          [2]

          MySQL 索引詳解: https://javaguide.cn/database/mysql/mysql-index.html


          ··········? END? ··············

          近期文章精選?:

          如果本文對(duì)你有幫助的話,歡迎點(diǎn)贊&在看&分享,這對(duì)我繼續(xù)分享&創(chuàng)作優(yōu)質(zhì)文章非常重要。感謝????

          瀏覽 37
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91人妻无码成人精品一区二区三区 | 亚洲— —在线 | 黄色片在线免费 | 1000色看免费 | 黄色成人网络空间在线播放 |