1. 程式人生 > >為什麼MongoDB採用B樹索引,而Mysql用B+樹做索引

為什麼MongoDB採用B樹索引,而Mysql用B+樹做索引

題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。
這就決定了B+樹更適合用來儲存外部資料,也就是所謂的磁碟資料。
從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關係性資料庫這種資料量大的索引能達到億級別,所以為了減少記憶體的佔用,索引也會被儲存在磁碟上。
那麼Mysql如何衡量查詢效率呢?磁碟IO次數,B-樹(B類樹)的特定就是每層節點數目非常多,層數很少,目的就是為了就少磁碟IO次數,當查詢資料的時候,最好的情況就是很快找到目標索引,然後讀取資料,使用B+樹就能很好的完成這個目的,但是B-樹的每個節點都有data域(指標),這無疑增大了節點大小,說白了增加了磁碟IO次數(磁碟IO一次讀出的資料量大小是固定的,單個數據變大,每次讀出的就少,IO次數增多,一次IO多耗時啊!),而B+樹除了葉子節點其它節點並不儲存資料,節點小,磁碟IO次數就少。這是優點之一。
另一個優點是什麼,B+樹所有的Data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指標串起來。這樣遍歷葉子節點就能獲得全部資料,這樣就能進行區間訪問啦。

至於MongoDB為什麼使用B-樹而不是B+樹,可以從它的設計角度來考慮,它並不是傳統的關係性資料庫,而是以Json格式作為儲存的nosql,目的就是高效能,高可用,易擴充套件。首先它擺脫了關係模型,上面所述的優點2需求就沒那麼強烈了,其次Mysql由於使用B+樹,資料都在葉節點上,每次查詢都需要訪問到葉節點,而MongoDB使用B-樹,所有節點都有Data域,只要找到指定索引就可以進行訪問,無疑單次查詢平均快於Mysql(但側面來看Mysql至少平均查詢耗時差不多)。

總體來說,Mysql選用B+樹和MongoDB選用B-樹還是以自己的需求來選擇的。

相關推薦

為什麼MongoDB採用B索引MysqlB+索引

題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。 這就決定了B+樹更適合用來儲存外部資料,也就是所謂的磁碟資料。 從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關係性資料庫這種資料量大

【原創】為什麼Mongodb索引用BMysqlB+?

引言 好久沒寫文章了,今天回來重操舊業。畢竟現在對後端開發的要求越來越高,大家要做好各種準備。 因此,大家有可能遇到如下問題 為什麼Mysql中Innodb的索引結構採取B+樹? 回答這個問題時,給自己留一條後路,不要把B樹噴的一文不值。因為網上有些答案是說,B樹不適合做檔案儲存系統的索引結構。如果按照那

為什麼 MongoDB索引)使用B- Mysql 使用 B+

謝邀~ 強答一發- -,不熟悉 mongoDB,大概瞭解了下是nosql,文件型資料庫 先從資料結構的角度來答。 題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。 這就決定了B+樹更適合用來儲存外部資料,也就是所謂的磁碟資料。

為什麼MysqlB+索引不用B-或紅黑

B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。所以從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關係性資料庫這種資料量大的索引能達到億級別,所以為了減少記憶體的佔用,索引也會被儲存

為什麼MysqlB+索引不用B-

題主應該知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。這就決定了B+樹更適合用來儲存外部資料,也就是所謂的磁碟資料。從Mysql(Inoodb)的角度來看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關係性資料庫這種資料量大的索

二叉查詢(BST)平衡二叉查詢(AVL)紅黑(RBT)B~/B+(B-tree)的比較

http://www.iteye.com/topic/614070 此少俠總結的特棒,直接收藏了。 我們這個專題介紹的動態查詢樹主要有: 二叉查詢樹(BST),平衡二叉查詢樹(AVL),紅黑樹(RBT),B~/B+樹(B-tree)。這四種樹都具備下面幾個優勢: (1) 都

給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C請判斷A+B是否大於C。

pat鏈接:https://www.nowcoder.com/pat/6/problem/4077題目描述給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C,請判斷A+B是否大於C。輸入描述:輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組占一行,順序給出A

為什麽if else 語句裏不能函數聲明定義函數可以函數表達式定義函數

java 關鍵字 {} 作用 關系 另一個 else 語法 出錯 在《JavaScript高級程序設計》第三版第7章函數表達式部分講到,定義函數有兩種方式:一種是函數聲明,另一種就是函數表達式。函數聲明的語法是這樣的。function functionName(arg0,

(如數據結構算法題)編程不是難在處理問題的思路代碼將思路描述出來。

思維 正常 一次 cte -- 習慣 加減 想要 not 初學編程總覺得好簡單,不就是加減乘除,或者什麽,思路太簡單了,就這樣這樣做就可以了,代碼就不用寫了,反正這麽簡單。 其實難就難在,如何用代碼這種語言將你的思路書寫下來。 寫代碼會受到很多的限制,你想要這樣幹,但你要如

如何修改帶索引的欄位的長度檢視、刪除索引修改欄位屬性、建立索引

需要重新建立索引,因為長度不同會認為是兩個不同的所索引。 建立和刪除索引 索引的建立可以在CREATE TABLE語句中進行,也可以單獨用CREATE INDEX或ALTER TABLE來給表增加索引。刪除索引可以利用ALTER TABLE或DROP INDEX語句來實現。 (1)使用ALTER T

pat:給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C請判斷A+B是否大於C。

題目描述 給定區間[-2的31次方, 2的31次方]內的3個整數A、B和C,請判斷A+B是否大於C。 輸入描述: 輸入第1行給出正整數T(<=10),是測試用例的個數。隨後給出T組測試用例,每組佔一行,順序給出A、B和C。整數間以空格分隔。 輸出描述:

orcl索引失效重建所有索引或者根據名稱空間重建所有索引

create or replace procedure p_rebuild_all_index    (tablespace_name in varchar2,--這裡是表空間名,如果不改變表空間,可以傳入null    only_unusable in b

Rainnnbow(快樂的祕密不在於“成就卓越”在於“不斷成長”。一個樂於學習的追求優雅的與時俱進的理想程式設計師)

Java基礎知識日常總結 該專欄是本人在日常工作中對Java的基礎知識的學習和總結。每篇部落格會針對Java中的一個具體點進行分析和總結,這樣的點積累多了,對Java的基礎知識就慢慢掌握了。隨著本人對Java學習的深入,文章涉及的

Vue Treeselect下拉實現選擇部門下拉下拉選單

先來看一張最基本的效果圖: 介紹 具有巢狀選項支援的單個和多個選擇 模糊匹配 非同步搜尋 延遲載入(僅在需要時載入深層選項的資料) 鍵盤支援(使用Arrow Up&Arrow Down鍵導航,使用鍵選擇選項Enter等) 豐富的選項和高度可定製 支

查詢A、B表中A表中B表沒有的資料

(轉)A、B兩表,找出ID欄位中,存在A表,但是不存在B表的資料。A表總共13w資料,去重後大約3W條資料,B表有2W條資料,且B表的ID欄位有索引。 方法一   使用 not in ,容易理解,效率低  ~執行時間為:1.395秒~ 1 select distin

太刺激了面試官讓我手寫跳錶兩種實現方式吊打了TA!

# 前言 > 本文收錄於專輯:[http://dwz.win/HjK](http://dwz.win/HjK),點選解鎖更多資料結構與演算法的知識。 你好,我是彤哥。 上一節,我們一起學習了關於跳錶的理論知識,相信通過上一節的學習,你一定可以給面試官完完整整地講清楚跳錶的來龍去脈,甚至能夠邊講邊畫

【工作筆記】Socket、TCP到底是什麼我可以Python來實驗嗎?

Socket 中文是套接字。這個翻譯總感覺誤人子弟,至少大一大二時的我就看不懂,直到現在才明白。其實Socket本質就是對網路傳輸行為的封裝,通過這個封裝我們可以無視網路層、鏈路層和傳輸層的是怎麼做的。 我只要告訴它,我要用到的協議型別是TCP還是UDP。

MySQL資料庫為什麼大多使用B+不是Hash儲存索引

通常B+資料的查詢時間為log(n),而利用Hash時間為o(1),那為什麼還要用B+樹呢。 對於B+樹,相比於Hash好處: 1.利用Hash需要把資料全部載入到記憶體中,如果資料量大,是一件很消耗記憶體的事,而採用B+樹,是基於按照節點分段載入,由此減少記憶體消耗。 2.和業務場

Mysql索引為什麼B+不用B-

先從資料結構的角度來看  我們知道B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。  這就決定了B+樹更適合用來儲存外部資料,也就是所謂的磁碟資料。 從Mysql(Inoodb)的角度來看   B+樹是用來充當索引的,一般來說索引非常大

Mysql InnoDB B+索引和雜湊索引的區別? MongoDB 為什麼使用B-?

B-樹和B+樹最重要的一個區別就是B+樹只有葉節點存放資料,其餘節點用來索引,而B-樹是每個索引節點都會有Data域。 B+樹 B+樹是為磁碟及其他儲存輔助裝置而設計一種平衡查詢樹(不是二叉樹)。B+樹中,所有記錄的節點按大小順序存放在同一層的葉節點中,各葉