1. 程式人生 > >B+樹以及非聚簇索引和聚簇索引

B+樹以及非聚簇索引和聚簇索引

1 B樹以及B+樹

1.1 B樹

是一種多路搜尋樹,假設為M叉樹
1. 每個節點中的關鍵字,比指向兒子的指標少一,即每個節點最多有M-1個關鍵字和M個指標
2. 關鍵字集合分佈在整棵樹中,任何一個關鍵字出現且只出現在一個節點中,即是說,有可能在非葉子節點命中。

這裡寫圖片描述

1.2 B+樹

B+樹是B樹的變種,也是一種多路搜尋樹,假設為M叉樹
1. 每個節點的關鍵字個數和指向兒子的指標樹最多一樣,即每個節點最多有M個關鍵字和M個指標。
2. 所有關鍵字都會在葉子節點出現,所以不可能在非葉子節點命中。

這裡寫圖片描述

1.3 MySQL索引採用B+/B樹原因

從上面1.1 , 1.2可知,不管是B樹,還是B樹,其形狀都是“矮胖”型的,而紅黑樹或是AVL樹,都是“高瘦”型。
上面這兩種形狀的樹,如果在記憶體中查詢時,不會有什麼問題。但是,如果現在資料是在磁碟,每次查詢都要將磁碟中的資料載入記憶體中。一般來講,訪問一個節點,就要訪問一次磁碟。
由上可知,“矮胖”型的,到命中時,訪問的節點要更少,也就是更少的訪問磁碟,所以,“矮胖”型更加高效,更適合做索引。

2 非聚簇索引和聚簇索引

2.1 非聚簇索引

非聚簇索引就是說,葉子節點只是存著資料的地址,而不是資料本身。索引檔案和資料檔案兩個檔案是分開的。MyISAM就是採用非聚簇索引。
這裡寫圖片描述


非聚簇索引的主鍵索引和二級索引是什麼區別的,上面圖為主鍵索引,再來一個二級索引。
這裡寫圖片描述
查詢時,從上到下找到葉子節點,葉子節點儲存著資料的地址,拿到這個地址後,就可以直接到磁碟中找了。

2.2 聚簇索引

聚簇索引的葉子節點中儲存著資料,InnoDB就是用聚簇索引的。
其主索引如下:
這裡寫圖片描述
而在聚簇索引的二級索引中,葉子節點儲存著主鍵,所以在二級索引中查詢時,先找到二級索引中的主鍵,在根據這個主鍵,從聚簇索引中找到該主鍵的資料,所以需要兩次查詢。
這裡寫圖片描述