1、文件很大,不可能全部存儲在內存中,所以要存在磁盤上
2、索引的組織結構要盡量減少查找過程中磁盤I/O的存取次數(為什么用B-/+Tree,還跟磁盤存取原理有關)
3、B+樹所有的data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指針串起來,這樣遍歷葉子節點就能獲得全部數據
二、什么是聚簇索引
像innodb中,主鍵的索引結構中,既存儲了主鍵值,有存儲了行數據,這種數據成為‘聚簇索引’
三、為什么MongoDB采用B樹索引,而mysql用B+樹做索引
b+樹只有葉節點存放數據,其余節點用來索引,b-樹是每個索引節點都會有data域
這就決定了B+樹更適合用來存儲外部數據,也就是所謂的磁盤數據
從mysql(innodb)的角度看,B+樹是用來充當索引的,一般來說索引非常大,尤其是關系型數據庫這種數據量大的索引能達到億級別,
所以為了減少內存的占用,索引也會被存儲在磁盤上
那么mysql是如何衡量查詢效率的呢,磁盤IO次數,B-樹的特定就是每層節點數目非常多,層數很少,目的就是為了減少磁盤IO次數,當查詢數據的時候,
最好的情況就是很快找到目標索引,然后讀取數據,使用B+樹就能很好的完成這個目的,但是B-樹的每個節點都有data域(指針),這無疑增大了節點大小,說白了增加了磁盤IO次數(磁盤IO一次讀出的數據量大小是固定的,單個數據變大,每次讀出的就少,IO次數增多,一次IO多耗時啊)
原因1:B+樹除了葉子節點其他節點並不存儲數據,節點小,磁盤IO次數就少
原因2:B+樹所有的data域在葉子節點,一般來說都會進行一個優化,就是將所有的葉子節點用指針串起來,這樣遍歷葉子節點就能獲得全部數據
至於MongoDB為什么使用B-樹而不是B+樹,可以從它的設計角度來考慮,它並不是傳統的關系型數據庫,而是以json格式作為存儲的nosql,目的就是高性能,高可用,易擴展。首先它擺脫了關系模型,上面所述的優點需求就沒那么強烈了,其次mysql由於使用B+樹,數據都在葉節點上,每次查詢都需要訪問到葉節點,而MongoDB使用B-樹,所有節點都有data域,只要找到指定索引就可以進行訪問,無疑單詞查詢平均快於mysql(但側面來看mysql至少平均查詢耗時差不多)
總體來說,mysql選用B+樹和MongoDB選用B-樹還是以自己的需求來選擇的