爲何mysql innodb索引是B+樹數據結構

一、文件很大,不可能所有存儲在內存中,因此要存在磁盤上mysql

二、索引的組織結構要儘可能減小查找過程當中磁盤I/O的存取次數(爲何用B-/+Tree,還跟磁盤存取原理有關)sql

三、B+樹全部的data域在葉子節點,通常來講都會進行一個優化,就是將全部的葉子節點用指針串起來,這樣遍歷葉子節點就能得到所有數據數據庫

 

2、什麼是聚簇索引json

像innodb中,主鍵的索引結構中,既存儲了主鍵值,有存儲了行數據,這種數據成爲‘聚簇索引’nosql

3、爲何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-樹仍是以本身的需求來選擇的

相關文章
相關標籤/搜索