Mysql選用B+樹和MongoDB選用B-樹

先從數據結構的角度來答。sql

  • 應該知道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-樹仍是以本身的需求來選擇的。
相關文章
相關標籤/搜索