日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

很多同學(xué)在面試中會(huì)被問到數(shù)據(jù)庫(kù)的問題,而常被問到的一個(gè)問題就是:

MySQL 中的 InnoDB 和 MyISAM 之間是什么關(guān)系分別有什么特點(diǎn)

許多同學(xué)都把 MySQL 作為自己的數(shù)據(jù)庫(kù),但是可能用過(guò)最多的就是 SQL 語(yǔ)句,以及一些 ORM 的寫法,而對(duì)底層的實(shí)現(xiàn)了解甚少,比如上述問題中,InnoDB 和 MyISAM 分別是什么,可能都不是非常清楚。然而在一些大型公司(比如騰訊)的面試題中,可能會(huì)高頻率地出現(xiàn)這類的問題,所以對(duì)于這類問題的正確理解,就顯得非常重要了。

其實(shí) InnoDB 和 MyISAM 是 MySQL 的兩個(gè)「存儲(chǔ)引擎」。

下面我將詳細(xì)闡述一下這兩者之間的聯(lián)系和區(qū)別。

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

數(shù)據(jù)庫(kù)存儲(chǔ)引擎

數(shù)據(jù)庫(kù)存儲(chǔ)引擎是數(shù)據(jù)庫(kù)底層軟件組織,數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)。不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平等功能,使用不同的存儲(chǔ)引擎,還可以獲得特定的功能。

如何知道自己的數(shù)據(jù)庫(kù)用的什么引擎呢?

SHOW ENGINES;

 

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

我們可以看出數(shù)據(jù)庫(kù)為我們提供了非常多的存儲(chǔ)引擎,從表中看出,InnoDB 的 Support 列是 DEFAULT,表明在我的數(shù)據(jù)庫(kù)服務(wù)器上,InnoDB 是默認(rèn)的數(shù)據(jù)庫(kù)引擎,不過(guò) MySQL 對(duì)于多引擎有很好的兼容,一個(gè)數(shù)據(jù)庫(kù)服務(wù)器上不同的數(shù)據(jù)庫(kù)完全可以使用不同的數(shù)據(jù)引擎,甚至一個(gè)數(shù)據(jù)庫(kù)中的多個(gè)表也可以使用不同的引擎。

從一些文檔中我們可以總結(jié)出這兩個(gè)引擎的一些差異:

  • InnoDB 支持事務(wù),MyISAM 不支持,對(duì)于 InnoDB 每一條 SQL 語(yǔ)句都默認(rèn)封裝成事務(wù)進(jìn)行提交,這樣就會(huì)影響速度,優(yōu)化速度的方式是將多條 SQL 語(yǔ)句放在 begin 和 commit 之間,組成一個(gè)事務(wù);
  • InnoDB 支持外鍵,而 MyISAM 不支持。

所以如果一個(gè)表修改要求比較高的事務(wù)處理,可以選擇 InnoDB。這個(gè)數(shù)據(jù)庫(kù)中可以將查詢要求比較高的表選擇 MyISAM 存儲(chǔ)。如果該數(shù)據(jù)庫(kù)需要一個(gè)用于查詢的臨時(shí)表,甚至可以考慮選擇 MEMORY 存儲(chǔ)引擎。

但是為什么 InnoDB 和 MyISAM 之間會(huì)有這些差異呢?我們需要了解一下對(duì)應(yīng)的儲(chǔ)存引擎的底層原理。

?

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

存儲(chǔ)引擎原理

首先針對(duì)可能面試會(huì)問到的問題「MyISAM 和 InnoDB 兩種引擎所使用的索引的數(shù)據(jù)結(jié)構(gòu)是什么」做一個(gè)回答:

都是 B+ 樹,不過(guò)區(qū)別在于:

  • MyISAM 中 B+ 樹的數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的內(nèi)容是實(shí)際數(shù)據(jù)的地址值,它的索引和實(shí)際數(shù)據(jù)是分開的,只不過(guò)使用索引指向了實(shí)際數(shù)據(jù)。這種索引的模式被稱為非聚集索引。
  • InnoDB 中 B+ 樹的數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的都是實(shí)際的數(shù)據(jù),這種索引有被稱為聚集索引。

 

B 樹和 B+ 樹

那么什么是 B+ 樹?

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

B+ 樹是 B 樹的一個(gè)變種,對(duì)于 B 樹來(lái)說(shuō):

B 樹屬于多叉樹又名平衡多路查找樹,其規(guī)則是:

  • 所有節(jié)點(diǎn)關(guān)鍵字是按遞增次序排列,并遵循左小右大原則
  • 子節(jié)點(diǎn)數(shù):非葉節(jié)點(diǎn)的子節(jié)點(diǎn)數(shù)>1,且<=M ,且M>=2,空樹除外(注:M階代表一個(gè)樹節(jié)點(diǎn)最多有多少個(gè)查找路徑,M=M 路,當(dāng) M=2 則是 2 叉樹,M=3 則是 3 叉)
  • 關(guān)鍵字?jǐn)?shù):枝節(jié)點(diǎn)的關(guān)鍵字?jǐn)?shù)量大于等于 ceil(m/2)-1 個(gè)且小于等于 M-1 個(gè)(注:ceil() 是個(gè)朝正無(wú)窮方向取整的函數(shù) 如 ceil(1.1)結(jié)果為 2)
  • 葉節(jié)點(diǎn)的指針為空且葉節(jié)點(diǎn)具有相同的深度

而對(duì)于 B+ 樹:

B+ 樹是 B 樹的一個(gè)升級(jí)版,相對(duì)于 B 樹來(lái)說(shuō) B+ 樹更充分的利用了節(jié)點(diǎn)的空間,讓查詢速度更加穩(wěn)定,其速度完全接近于二分法查找。

一個(gè) B+ 樹的 C++ 定義類似如下:

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 


面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

?

什么是索引

由于以上實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫(kù)中索引相關(guān),關(guān)于索引,有以下知識(shí):

  • 唯一索引:唯一索引不允許兩行具有相同的索引值
  • 主鍵索引:為表定義一個(gè)主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個(gè)值是唯一的,并且不能為空
  • 聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個(gè)表只能有一個(gè)
  • 非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲(chǔ)在一個(gè)位置,索引存儲(chǔ)在另一個(gè)位置,索引中包含指向數(shù)據(jù)存儲(chǔ)位置的指針。可以有多個(gè),小于 249 個(gè)

 

MyISAM

回到 MyISAM,其索引結(jié)構(gòu)如下圖所示,由于 MyISAM 的索引文件僅僅保存數(shù)據(jù)記錄的地址。在 MyISAM 中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別:

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

MyISAM 中索引檢索的算法為首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其 data 域的值,然后以 data 域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。

InnoDB

對(duì)于 InnoDB 來(lái)說(shuō),表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個(gè)索引結(jié)構(gòu),這棵樹的葉節(jié)點(diǎn) data 域保存了完整的數(shù)據(jù)記錄。

面試 | MySQL 中 InnoDB 和 MyISAM 的聯(lián)系與區(qū)別

 

由于 InnoDB 利用的數(shù)據(jù)庫(kù)主鍵作為索引 Key,所以 InnoDB 數(shù)據(jù)表文件本身就是主索引,且因?yàn)?InnoDB 數(shù)據(jù)文件需要按照主鍵聚集,所以使用 InnoDB 作為數(shù)據(jù)引擎的表需要有個(gè)主鍵,如果沒有顯式指定的話 MySQL 會(huì)嘗試自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)的列作為主鍵,如果無(wú)法找到,則會(huì)生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類型為長(zhǎng)整形。

小結(jié)

對(duì)于面試題來(lái)說(shuō),一般只會(huì)被要求回答到 InnoDB 和 MyISAM 在使用上的區(qū)別,不過(guò)如果需要深究一下為什么會(huì)有那些區(qū)別的話,就需要了解其底層的實(shí)現(xiàn)原理,順便還需要對(duì)于 B+ 樹有一定的了解,相信讀者在讀完本文后已經(jīng)可以比較清晰地了解其背后的原理概要了,離拿到希望的 Offer 又近了一步。

本文作者:Nova Kwok

聲明:本文歸 “力扣” 版權(quán)所有,如需轉(zhuǎn)載請(qǐng)聯(lián)系。

文中部分圖片來(lái)源于網(wǎng)絡(luò),為非商業(yè)用途使用,如有侵權(quán)聯(lián)系刪除。

分享到:
標(biāo)簽:MySQL
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定