大廠面試必備(一)——數據庫索引的本質解析

一、索引概述

      索引是半數數據庫高效獲取數據的排好序的數據結構。
      索引數據結構:二叉樹、紅黑樹、Hash表、B-Tree。

在這裏插入圖片描述

二叉樹

      如上圖所示是一個二叉樹的結構,但是索引不會是二叉樹的數據結構。從上圖我們可以看出右邊節點始終大於父節點,可以想象,當我們用Col1做索引列的時候,形成的二叉樹是一個只有右節點的二叉樹(線型,類似成了鏈表結構)。所以用二叉樹做索引是有弊端的,所以mysql最終沒有選擇用它來實現索引。
Col1做索引的二叉樹

紅黑樹

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
      如圖所示,當插入0004時,右邊的節點比左邊的節點多了一層。當插入0005時,有點的節點可能回比左邊的節點多兩層。此時,紅黑樹會通過自旋,讓此時0002節點的右子樹的層數控制在不超過左子樹兩層。紅黑樹也就是平衡二叉樹,也是優化後的普通二叉樹。但是,我們也可以發現這樣的問題,當數據量比較大的時候,紅黑樹的高度也會很高,一次比較就得經過一次磁盤IO,如果查詢的數據剛好在葉子節點,同樣會導致查詢效率的問題。

B-Tree

(1)葉節點具有相同的深度,葉節點的指針爲空;
(2)所有索引元素不重複;
(3)節點中的數據索引從左到右遞增排列。
在這裏插入圖片描述
      如圖所示是B-Tree的結構,由圖可知B-Tree一個節點有多個數據。當進行查詢時,會一次性將一個節點上的所有數據都加載到內存中,也就是進行一次IO,接着在內存裏面進行查找和對比。要知道,在內存裏面隨機查找一個數據是很快的。
      那麼,我們可不可以將所有數據都放到一個節點上,一次性全部數據加載到內存然後再對比查找?答案是否定的,一、RAM內存有限,數據可能很多甚至上千萬條;二、一次磁盤IO也沒辦法查太多數據。
在這裏插入圖片描述
      根據sql查詢結果可知,mysql設置了每個節點的大小爲16kb。

B+Tree(B-Tree變種)
  • 非葉子節點不存儲data,只存儲索引(冗餘),可以放更多的索引;
  • 葉子節點包含所有索引字段;
  • 葉子節點用指針鏈接,提高區間訪問的性能;
  • 任意一個節點上的數據從左到右是遞增的。

在這裏插入圖片描述
      我們假設上圖中的索引數字爲bigint(大小爲8B),每個索引後面跟着一個指向下一個節點的指針(大小爲6B)。前面我們知道一個節點的大小爲16KB,那麼一個非葉子節點可以存儲的索引數量爲16KB/(8B+6B)= 1170。假設B+Tree的高度爲3,葉子節點索引與Data大小爲1KB(根據節點的大小爲16KB,即葉子節點可以放16個元素),且每個節點都放滿了,那麼葉子節點總共大概可以存放多少數據。1170117016=21902400,由此可知,千萬級別的表,精確的用某個比較合適的索引去查,它的性能依然能夠非常高。即使兩千萬的數據,也只需要經歷兩次磁盤IO就可以查詢出結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章