日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 架構(gòu)師社區(qū)
[導(dǎo)讀]B+樹被廣泛應(yīng)用于MySQL數(shù)據(jù)庫(kù)的索引實(shí)現(xiàn),不過并未展開細(xì)說,但是呢B+樹是一種重要的數(shù)據(jù)結(jié)構(gòu),常年出現(xiàn)在各種面試題中,這次就來一起學(xué)習(xí)下和B+樹相關(guān)的MySQL索引底層實(shí)現(xiàn)的內(nèi)容。

B+樹被廣泛應(yīng)用于MySQL數(shù)據(jù)庫(kù)的索引實(shí)現(xiàn),不過并未展開細(xì)說,但是呢B+樹是一種重要的數(shù)據(jù)結(jié)構(gòu),常年出現(xiàn)在各種面試題中,這次就來一起學(xué)習(xí)下和B+樹相關(guān)的MySQL索引底層實(shí)現(xiàn)的內(nèi)容。

面試官:簡(jiǎn)單講講MySQL數(shù)據(jù)庫(kù)的索引實(shí)現(xiàn),以及為什么這么實(shí)現(xiàn)?

這個(gè)面試題出現(xiàn)的頻率非常之高,從我自己和朋友們參加的大小廠面試都有被問過這個(gè)問題,大部分人可能看過一些網(wǎng)上的博客能說出個(gè)一二三,如果面試官?zèng)]有細(xì)問還真能混過去,但是對(duì)于細(xì)節(jié)沒能真正理解的非常透徹。

所以今天堂主檸檬就來寫寫這個(gè)話題,讓你知其然也知其所以然。寫作目標(biāo)是無論你是否學(xué)過數(shù)據(jù)結(jié)構(gòu),看完都能徹底搞懂這個(gè)問題,花5分鐘來跟著學(xué)一遍看看我有沒有做到吧。

首先需要明白,數(shù)據(jù)庫(kù)索引是在存儲(chǔ)引擎層實(shí)現(xiàn),常見的存儲(chǔ)引擎有 2 種。

InnoDB 存儲(chǔ)引擎:

innoDB存儲(chǔ)引擎支持事務(wù),其設(shè)計(jì)目標(biāo)是面向在線事務(wù)處理的應(yīng)用,行鎖設(shè)計(jì)、支持外鍵,默認(rèn)度操作不會(huì)產(chǎn)生鎖,從MySLQ 5.5.7版本開始,InnoDB存儲(chǔ)引擎作為默認(rèn)的存儲(chǔ)引擎存在于MySLQ中。

MyISAM 存儲(chǔ)引擎:

MyISAM存儲(chǔ)引擎不支持事務(wù),表鎖設(shè)計(jì),支持全文索引,主要面向離線事務(wù)處理的數(shù)據(jù)庫(kù)應(yīng)用,在InnoDB引擎成為默認(rèn)引擎之前,MyISAM存儲(chǔ)引擎一直霸占著默認(rèn)存儲(chǔ)引擎的位置,直到他被InnoDB取代,這是個(gè)悲傷的故事。

存儲(chǔ)引擎不同,索引實(shí)現(xiàn)方式也不盡相同,因此,我們先約定本文講的索引都是InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的B+樹索引。

MySQL架構(gòu)

索引由存儲(chǔ)引擎實(shí)現(xiàn),那存儲(chǔ)引擎到底是個(gè)什么東西呢?

從我們平常使用的的角度來看,對(duì)MySQL的直觀感受是命令行的各種指令,或是一個(gè)數(shù)據(jù)庫(kù)管理工具比如SQLyog的界面點(diǎn)擊操作,堂主檸檬在剛接觸MySQL時(shí)就是用的SQLyon圖形界面操作,就是下面這個(gè)小海豚。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

MySQL可能是世界上最流行的開源數(shù)據(jù)庫(kù)引擎,但使用基于文本的工具和配置文件管理起來可能很困難。SQLyog提供了一個(gè)完整的圖形界面,即使對(duì)于初學(xué)者來說,使用MySQL的強(qiáng)大功能也很簡(jiǎn)單,SQLyog直觀的圖形用戶界面使您可以輕松管理MySQL數(shù)據(jù)庫(kù)的各個(gè)方面。

不管是使用圖形界面還是命令行,我們接觸到的都只是客戶端,MySQL作為一個(gè)軟件系統(tǒng)的架構(gòu),存儲(chǔ)引擎在MySQL服務(wù)端系統(tǒng)架構(gòu)的什么位置呢?

總的來說,MySLQ系統(tǒng)架構(gòu)分為 ?3 層,直接上圖,看下MySQL的架構(gòu)劃分。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!
  • 第一層:連接管理層。MySLQ是典型的CS模型軟件,所謂CS就是客戶端/服務(wù)端的意思,作為一個(gè)靠網(wǎng)絡(luò)連接的服務(wù),必不可少的要有連接管理層,用于管理和維護(hù)MySQL服務(wù)端和客戶端之間的連接、鑒權(quán)等等。
  • 第二層:這一層是MySQL的核心服務(wù)功能層,包括了查詢緩存、解析器、優(yōu)化器等所有跨存儲(chǔ)引擎的功能都在這一層實(shí)現(xiàn),屏蔽掉存儲(chǔ)引擎間的差別,對(duì)上層也就是連接管理層提供統(tǒng)一的接口。
  • 第三層:存儲(chǔ)引擎層就在這一層實(shí)現(xiàn),負(fù)責(zé)MySQL中數(shù)據(jù)的存儲(chǔ)和提取,這其中有我們今天的主角InnoDB存儲(chǔ)引擎和它實(shí)現(xiàn)的B+樹索引。

如何指定存儲(chǔ)引擎類型

既然要研究innoDB的索引,那我們首先來創(chuàng)建一個(gè)使用innoDB存儲(chǔ)引擎的表。

MySQL目前支持的存儲(chǔ)引擎種類非常豐富,可以在連接MySQL客戶端,進(jìn)入到命令行模式下,輸入如下命令查看當(dāng)前版本MySQL提供的所有存儲(chǔ)引擎。

show?engines;
數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

可以看到上圖中有包含MyISAM 和 InnoDB 這兩種常見引擎,關(guān)于這些存儲(chǔ)引擎的詳細(xì)介紹,可以參考MySQL的官方文檔,我放上鏈接:

https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html

好了,現(xiàn)在來創(chuàng)建數(shù)據(jù)表并指定innoDB存儲(chǔ)引擎。

舉個(gè)栗子:創(chuàng)建表一張大佬數(shù)據(jù)表 BigOld,表中第一個(gè)字段是大佬 id 標(biāo)識(shí),第二個(gè)字段是大佬名字 name,并指定數(shù)據(jù)庫(kù)使用的存儲(chǔ)引擎類型ENGINE=InnoDB ,下面這條建表語(yǔ)句創(chuàng)建并指定了一個(gè)使用 InnoDB 存儲(chǔ)引擎的數(shù)據(jù)庫(kù)表。

CREATE?TABLE?BigOld?(
????id?INT,
????name?CHAR?(32),?
????PRIMARY?KEY?(id))?ENGINE=InnoDB;

當(dāng)然,如果你一開始創(chuàng)建的表使用的不是InnoDB引擎,那也沒關(guān)系,還可以再創(chuàng)建表之后修改表的存儲(chǔ)引擎,像下面的這樣操作。

alert?table?BigOld?engine?=?InnoDB

索引

好了,經(jīng)過前面的操作,終于我們有了一個(gè)innoDB的數(shù)據(jù)表,現(xiàn)在我們可以來講講innoDB存儲(chǔ)引擎的索引,索引的作用當(dāng)然是為了快速的存取MySQL數(shù)據(jù)庫(kù)的數(shù)據(jù)。

舉個(gè)栗子,如果把MySQL比作一個(gè)大型圖書館,其中的數(shù)據(jù)比作圖書館里的書

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!
圖書館 unsplash.com

你去圖書館找書,圖書館那么大我們不可能一頭扎進(jìn)去,一層層、一個(gè)個(gè)書架去找想要的書,這時(shí)候我們會(huì)在圖書管理系統(tǒng)中通過圖書編號(hào)(索引)查詢到圖書所在的樓層,到了指定的樓層在通過書架上的提示找到對(duì)應(yīng)區(qū)域,最終在某個(gè)書架找到想要的書,這個(gè)圖書編號(hào)就起到索引的作用,幫助我們快速找到圖書(數(shù)據(jù))。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

存儲(chǔ)形式

InnoDB存儲(chǔ)引擎用B+樹實(shí)現(xiàn)索引,說到B+樹不得不提到他的兄弟B樹,這兩者的區(qū)別比較微妙,但查詢磁盤存儲(chǔ)數(shù)據(jù)的性能上卻相差很大,要知道為何MySQL InnoDB 選擇B+樹而不選擇B樹做索引,我們先來假設(shè)分別用這兩種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)索引對(duì)比一下。

B樹索引

拿來一本數(shù)據(jù)結(jié)構(gòu)的教材,我們翻開B樹的定義。一棵M階的b樹是這么定義的:

  1. 定義任意非葉子結(jié)點(diǎn)最多只有M個(gè)兒子,且M>2;
  2. 根結(jié)點(diǎn)的兒子數(shù)為[2, M];
  3. 除根結(jié)點(diǎn)以外的非葉子結(jié)點(diǎn)的兒子數(shù)為[M/2, M],向上取整;
  4. 非葉子結(jié)點(diǎn)的關(guān)鍵字個(gè)數(shù)=兒子數(shù)-1;
  5. 所有葉子結(jié)點(diǎn)位于同一層;
  6. k個(gè)關(guān)鍵字把節(jié)點(diǎn)拆成k+1段,分別指向k+1個(gè)兒子,同時(shí)滿足查找樹的大小關(guān)系。

看完你大概有點(diǎn)懵,不過沒關(guān)系,我們現(xiàn)是要對(duì)比它和B+樹在數(shù)據(jù)庫(kù)索引上的使用,不是要去手寫一個(gè)數(shù)據(jù)庫(kù)索引,只要抓住它主要的特點(diǎn)便于理解幫助我們理解索引原理即可,這里抓住B樹最主要的兩個(gè)特點(diǎn):

  1. 非葉子節(jié)點(diǎn)只存放「索引」和指向子節(jié)點(diǎn)的「指針」。
  2. 葉子節(jié)點(diǎn)存放「索引」和「數(shù)據(jù)」,且葉子節(jié)點(diǎn)之間沒有關(guān)聯(lián)。

便于理解,假如在數(shù)據(jù)庫(kù)中使用B樹來做索引結(jié)構(gòu),我試著畫出這個(gè)B樹的索引結(jié)構(gòu)圖,如下:

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

B+樹索引

看完了B樹索引實(shí)現(xiàn),現(xiàn)在我們來用B+樹實(shí)現(xiàn)索引看看,一樣的隨便打開一本數(shù)據(jù)結(jié)構(gòu)教材找到B+樹的定義,一顆M階的B+樹:

  1. 有n棵子樹的非葉子結(jié)點(diǎn)中含有n個(gè)關(guān)鍵字(b樹是n-1個(gè)),這些關(guān)鍵字不保存數(shù)據(jù),只用來索引,所有數(shù)據(jù)都保存在葉子節(jié)點(diǎn)(b樹是每個(gè)關(guān)鍵字都保存數(shù)據(jù))。
  2. 所有的葉子結(jié)點(diǎn)中包含了全部關(guān)鍵字的信息,及指向含這些關(guān)鍵字記錄的指針,且葉子結(jié)點(diǎn)本身依關(guān)鍵字的大小自小而大順序鏈接。
  3. 所有的非葉子結(jié)點(diǎn)可以看成是索引部分,結(jié)點(diǎn)中僅含其子樹中的最大(或最小)關(guān)鍵字。
  4. 通常在b+樹上有兩個(gè)頭指針,一個(gè)指向根結(jié)點(diǎn),一個(gè)指向關(guān)鍵字最小的葉子結(jié)點(diǎn)。
  5. 同一個(gè)數(shù)字會(huì)在不同節(jié)點(diǎn)中重復(fù)出現(xiàn),根節(jié)點(diǎn)的最大元素就是b+樹的最大元素。
數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

如果以前沒接觸過數(shù)據(jù)結(jié)構(gòu)相關(guān)概念,看完估計(jì)還是不大明白,沒關(guān)系,那不是本文的重點(diǎn),我們不去深究細(xì)枝末節(jié)。

我來幫你總結(jié)下,B+樹和B樹有很多相同的特點(diǎn),但也有一些不同讓B+樹在查詢磁盤存儲(chǔ)的數(shù)據(jù)時(shí)有更好的性能(為什么?我們稍后講),最大的不同是下面兩個(gè)

  1. 「數(shù)據(jù)」只存放葉子節(jié)點(diǎn)上面的,非葉子節(jié)點(diǎn)存放「索引」和「指針」。
  2. 葉子節(jié)點(diǎn)按大小順序通過雙向鏈表連接起來,可以像遍歷鏈表一樣遍歷整棵B+樹。

innoDB的選擇

innoDB的索引選擇用B+樹來實(shí)現(xiàn),B樹和B+樹非常相似,為什么用B+樹不用B樹做索引呢?這就要從數(shù)據(jù)庫(kù)的存儲(chǔ)方式說起。

性能瓶頸

innoDB索引以B+樹形式組織存儲(chǔ),我們首先要明白B+樹的每個(gè)節(jié)點(diǎn)不是保存在內(nèi)存而是放在屬于外部存儲(chǔ)的「磁盤頁(yè)」中。

為什么呢?因?yàn)閮?nèi)存快是快,但是它貴?。《液芏鄶?shù)據(jù)不是熱點(diǎn)數(shù)據(jù),十天半個(gè)月都用不上,完全沒必要都放在內(nèi)存里面,想想看如果淘寶會(huì)把那種萬億級(jí)別的交易訂單數(shù)據(jù)如果都存在內(nèi)存中嗎,馬爸爸雖然有錢也不至于這么奢侈。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

重點(diǎn)關(guān)注下這里所說的磁盤頁(yè),的大小每個(gè)系統(tǒng)可能不一樣,就堂主所用的這個(gè)Centos Linux系統(tǒng)來說,通過下面的命令查看磁盤頁(yè)大小為 4096B 也就是 4KB

[lemon/test]$?getconf?PAGE_SIZE
4096

這些磁盤數(shù)據(jù)頁(yè)如果是B+樹的葉子節(jié)點(diǎn),那就保存著關(guān)鍵字和數(shù)據(jù)(就是我們用 INSERT 語(yǔ)句塞進(jìn)數(shù)據(jù)庫(kù)的那些數(shù)據(jù))。數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

如果是非葉子節(jié)點(diǎn)那就保存著關(guān)鍵字和指針(指向子節(jié)點(diǎn)的指針),從上圖B+樹實(shí)現(xiàn)的索引示意圖也可以看到這兩種存儲(chǔ)形式的差別。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

內(nèi)存VS外存

當(dāng)我們?cè)贛ySQL InnoDB中執(zhí)行 select 查詢語(yǔ)句,這個(gè)查找數(shù)據(jù)的過程是這樣的

  • 沿著B+樹索引來查找一個(gè)給定關(guān)鍵字(或者范圍關(guān)鍵字)的所在的數(shù)據(jù)行。

  • 找到數(shù)據(jù)行所在的磁盤頁(yè),把這個(gè)磁盤頁(yè)加載到內(nèi)存中。

  • 在內(nèi)存中進(jìn)行查找(比如二分查找),最終得到目標(biāo)數(shù)據(jù)行內(nèi)容。

我們知道磁盤是外部存儲(chǔ)設(shè)備,那MySQL數(shù)據(jù)庫(kù)查找的時(shí)候?qū)⒋疟P中數(shù)據(jù)讀入內(nèi)存這個(gè)過程是非常緩慢的,對(duì)于機(jī)械硬盤具體來說,從磁盤加載數(shù)據(jù)需要經(jīng)過尋道、旋轉(zhuǎn)以及傳輸?shù)倪@些過程,時(shí)間花費(fèi)至少是幾十毫秒,作為對(duì)比,DDR4內(nèi)存尋址時(shí)間僅為6ns左右

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!
機(jī)械硬盤

內(nèi)存讀取速度是磁盤讀取速度的100萬倍!雖然現(xiàn)在固態(tài)硬盤的速度提升了很多,但和內(nèi)存比起來還是有很大的差距,所以要盡量減少數(shù)據(jù)庫(kù)對(duì)磁盤數(shù)據(jù)頁(yè)的隨機(jī)IO操作。

由于磁盤讀寫耗時(shí)的原因,在高并發(fā)系統(tǒng)中關(guān)系型數(shù)據(jù)庫(kù)MySQL會(huì)成為系統(tǒng)性能瓶頸。

在高并發(fā)服務(wù)中幾十毫秒的的耗時(shí)太久了,假設(shè)10ms處理一個(gè)請(qǐng)求,那1秒處理100個(gè) QPS=100 對(duì)比秒殺這一類的場(chǎng)景這個(gè)吞吐量完全是不夠用的,這也是現(xiàn)在像Redis這樣的高速緩存數(shù)據(jù)庫(kù)會(huì)站在前面,為MySQL擋一刀的原因,因?yàn)镽edis都是內(nèi)存操作,速度非常快!

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

Why B+樹?

為了更方便的說明B樹和B+樹兩種存儲(chǔ)結(jié)構(gòu)的差異,我們來對(duì)比下兩種樹實(shí)現(xiàn)的索引上讀取數(shù)據(jù)的過程,i再來回答innoDB 引擎為什么選B+樹。

為方便對(duì)比,假設(shè)我們?cè)贐和B+樹中我們都要「查詢 1 < id < 6 之間」的所有數(shù)據(jù)行。

B樹索引

先來看下如果索引用B樹來實(shí)現(xiàn),查找數(shù)據(jù)的流程圖:

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

在不考慮任何優(yōu)化的前提下,圖中綠色虛線是在B樹索引上查找數(shù)據(jù)的遍歷軌跡,來拆解一下:

  1. 從索引樹根節(jié)點(diǎn)開始,加載磁盤頁(yè) page1 找到第一個(gè)節(jié)點(diǎn) key=1 數(shù)據(jù)行(1,小林)不符合。
  2. 繼續(xù)通過指針找到磁盤頁(yè)面page2,加載磁盤頁(yè)page2到內(nèi)存, key=2 符合,讀取數(shù)據(jù)行 (2, 石頭)
  3. 重新加載磁盤頁(yè) page1 找到第二個(gè)節(jié)點(diǎn) key=3符合,讀取數(shù)據(jù)行(3,軒轅)。
  4. 繼續(xù)通過指針加載磁盤頁(yè) page4 到內(nèi)存,key=4 符合,讀取數(shù)據(jù)行(4,小北)。
  5. 重新加載磁盤頁(yè) page1 找到第三個(gè)節(jié)點(diǎn) key=5 符合,讀取數(shù)據(jù)行(5,why神)。

數(shù)一數(shù)上面的5個(gè)步驟有幾個(gè)「加載磁盤頁(yè)」字眼,5個(gè),還記得上面我們說的:**加載磁盤數(shù)據(jù)非常費(fèi)時(shí)!**這種隨機(jī)大量的磁盤IO造成了B樹索引的的性能瓶頸,使其與innoDB索引無緣。

B+樹索引

再來看下現(xiàn)在innoDB的用B+樹的實(shí)現(xiàn)方案吧,同樣的查詢條件,還是畫出數(shù)據(jù)查找的遍歷軌跡:

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

在不考慮任何優(yōu)化的前提下,圖中綠色虛線是在innoDB B+樹索引上查找數(shù)據(jù)的遍歷軌跡,同樣來拆解一下:

  1. 從索引樹根節(jié)點(diǎn)開始,加載磁盤頁(yè) page1 找到第一個(gè)節(jié)點(diǎn) key=1不符合,繼續(xù)往下搜索。
  2. 通過指針找到磁盤頁(yè)page2, 加載磁盤頁(yè)page2 到內(nèi)存,其中存放了key=1、2的數(shù)據(jù)行,讀取符合條件數(shù)據(jù)行。
  3. 由于葉子節(jié)點(diǎn)間組成雙向鏈表,直接順著page2 加載磁盤頁(yè)page3 、 加載磁盤頁(yè)page4,讀取其中符合條件的數(shù)據(jù)行。

這其中涉及了4次加載磁盤頁(yè)的操作,看起來只是比上面的B樹少了一次,但這是在我的簡(jiǎn)單例子,為了便于理解數(shù)據(jù)量比較少。

實(shí)際應(yīng)用中B+確實(shí)能夠減少大量的磁盤IO,從而大大提高查詢性能,而且由于B+樹根節(jié)點(diǎn)的數(shù)據(jù)已經(jīng)是排序好的雙向鏈表,我們可以像鏈表一樣遍歷所有數(shù)據(jù),非常適合范圍查找和排序操作!

再談B樹

B樹索引并非一無是處。雖然我們前面詳細(xì)對(duì)比了在innoDB中使用B+樹索引的優(yōu)勢(shì),但不要以為B樹就一無是處了,一種數(shù)據(jù)結(jié)構(gòu)被設(shè)計(jì)出來肯定是有使用場(chǎng)景的需求,不然誰(shuí)也不會(huì)閑著沒事折騰出一個(gè)東西,你說對(duì)吧。

事實(shí)上B樹也被用于實(shí)現(xiàn)數(shù)據(jù)庫(kù)索引,只不過不是在MySQL上。在MongoDB的索引設(shè)計(jì)上就使用了B樹做索引,什么是MongoDB呢?我不做過多介紹,感興趣的可以下來了解一下,下面這段話來自MongoDB 英文Wiki

MongoDB is a cross-platform document-oriented database program. Classified as a NoSQL database program, MongoDB uses JSON-like documents with optional schemas. MongoDB is developed by MongoDB Inc. and licensed under the Server Side Public License (SSPL).

只需要知道它和MySQl不同,MongoDB是一種文檔型的非關(guān)系型數(shù)據(jù)庫(kù),被劃分為NoSql數(shù)據(jù)庫(kù),使用類似JSON的語(yǔ)法存儲(chǔ)文檔,熟悉Redis的同學(xué)應(yīng)該很容易理解NoSQL的含義。

因?yàn)殛P(guān)系型數(shù)據(jù)庫(kù)比如 MySQL 經(jīng)常需要執(zhí)行遍歷和范圍查找的操作,B+樹的特點(diǎn)正是迎合了這樣的需求。但是在MongoDB這樣的NoSLQ數(shù)據(jù)庫(kù)中,在數(shù)據(jù)表的設(shè)計(jì)層面就決定了不會(huì)有太多的遍歷和范圍查找,基本就是一個(gè)鍵對(duì)應(yīng)一個(gè)值的單一查詢

在MongoDB上的查找如果用B+樹來實(shí)現(xiàn)索引的話,由于非葉子節(jié)點(diǎn)不存放數(shù)據(jù),每次查詢必須搜索到B+樹的葉子節(jié)點(diǎn)才能獲取到數(shù)據(jù),時(shí)間復(fù)雜度是固定的樹的高度 log n;

而如果用B樹實(shí)現(xiàn)索引,由于每個(gè)節(jié)點(diǎn)都可以存放數(shù)據(jù),幸運(yùn)的話有可能不必找到葉子節(jié)點(diǎn)就能取得數(shù)據(jù),復(fù)雜度更低,再來看下B樹實(shí)現(xiàn)的索引,如果換作是 MongoDB 你仔細(xì)品。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

雖然沒有MySQL的使用普及程度那么高,用B樹實(shí)現(xiàn)索引的MongoDB很多大公司也都有使用。

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!
使用客戶

脫離業(yè)務(wù)場(chǎng)景談具體實(shí)現(xiàn)都是耍流氓。正是由于關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用場(chǎng)景的不同,工程實(shí)現(xiàn)上最終會(huì)在損失和收益中找到平衡點(diǎn),使得B樹和B+樹在不同數(shù)據(jù)庫(kù)上有各自的用武之地。

所以下次面試和面試官夸MySQL B+樹索引好處的時(shí)候,注意別把 B 樹噴的太慘,以防面試官來個(gè)回馬槍,讓你說說為啥MongoDB還要用B樹來實(shí)現(xiàn)索引?這時(shí)候雖然你心里笑開了花,還是要假裝再思考下,愣著干嘛,接著繼續(xù)吹B樹啊。

特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

長(zhǎng)按訂閱更多精彩▼

數(shù)據(jù)庫(kù)存儲(chǔ)引擎大揭秘,不看不知道這里面的騷操作可真多!

如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉