為什麼mysql innodb索引是B 樹資料結構

2021-08-14 09:14:37 字數 1305 閱讀 7845

一、為什麼mysql innodb索引是b+樹資料結構?言簡意賅,就是因為:

1.檔案很大,不可能全部儲存在記憶體中,故要儲存到磁碟上

2.索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數(為什麼使用b-/+tree,還跟磁碟訪問原理有關。)

3、b+樹所有的data域在葉子節點,一般來說都會進行乙個優化,就是將所有的葉子節點用指標串起來,這樣遍歷葉子節點就能獲得全部資料。

二、什麼是聚簇索引?

像innodb中,主鍵的索引結構中,既儲存了主鍵值,又儲存了行資料,這種結構稱為」聚簇索引」

三、為什麼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多耗時啊!),原因1:b+樹除了葉子節點其它節點並不儲存資料,節點小,磁碟io次數就少。

原因2:b+樹所有的data域在葉子節點,一般來說都會進行乙個優化,就是將所有的葉子節點用指標串起來。這樣遍歷葉子節點就能獲得全部資料。

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

總體來說,mysql選用b+樹和mongodb選用b-樹還是以自己的需求來選擇的。

InnoDB儲存引擎為什麼選擇B 樹構建索引

索引是對資料庫表中乙個或多個列的值進行排序的資料結構,以協助快速查詢 更新資料庫表中資料。在mysql中,索引是在儲存引擎層實現的,所以並沒有統一的索引標準,即不同儲存引擎的索引的工作方式並不一樣。而即使多個儲存引擎支援同一種型別的索引,其底層的實現也可能不同。索引加速了資料訪問,因為儲存引擎不會再...

PHP為什麼empty可以訪問不存在的索引

開始之前,先丟擲問題 arr echo empty php eol var dump empty arr 1 echo is array php eol var dump is array arr 1 這段 的執行結果 你是否和我有過同樣的疑問?同樣是函式,為什麼empty訪問不存在的索引就不會報錯...

為什麼為什麼為什麼為什麼為什麼你要做一名程式設計師?

from 本文是從 why why why why why are you a developer?這篇文章翻譯而來。做乙個程式設計師很忙,你需要去寫 去建立meme,去進行測試,以及隨時關注最新最熱的gem 開源軟體技術。最近,我一直在想讓自己的節奏慢下來,去做一些心裡一直想做但沒有去做的事,去思...