MySQL系列 詳解B Tree

2021-08-06 03:36:11 字數 1353 閱讀 8366

如上圖,是一顆b+樹,關於b+樹的定義可以參見b+樹,這裡只說一些重點,淺藍色的塊我們稱之為乙個磁碟塊,可以看到每個磁碟塊包含幾個資料項(深藍色所示)和指標(黃色所示),如磁碟塊1包含資料項17和35,包含指標p1、p2、p3,p1表示小於17的磁碟塊,p2表示在17和35之間的磁碟塊,p3表示大於35的磁碟塊。真實的資料存在於葉子節點即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非葉子節點只不儲存真實的資料,只儲存指引搜尋方向的資料項,如17、35並不真實存在於資料表中。

b+樹的查詢過程

如圖所示,如果要查詢資料項29,那麼首先會把磁碟塊1由磁碟載入到記憶體,此時發生一次io,在記憶體中用二分查詢確定29在17和35之間,鎖定磁碟塊1的p2指標,記憶體時間因為非常短(相比磁碟的io)可以忽略不計,通過磁碟塊1的p2指標的磁碟位址把磁碟塊3由磁碟載入到記憶體,發生第二次io,29在26和30之間,鎖定磁碟塊3的p2指標,通過指標載入磁碟塊8到記憶體,發生第三次io,同時記憶體中做二分查詢找到29,結束查詢,總計三次io。真實的情況是,3層的b+樹可以表示上百萬的資料,如果上百萬的資料查詢只需要三次io,效能提高將是巨大的,如果沒有索引,每個資料項都要發生一次io,那麼總共需要百萬次的io,顯然成本非常非常高。

b+樹性質

1、通過上面的分析,我們知道io次數取決於b+數的高度h,假設當前資料表的資料為n,每個磁碟塊的資料項的數量是m,則有h=㏒(m+1)n,當資料量n一定的情況下,m越大,h越小;而m = 磁碟塊的大小 / 資料項的大小,磁碟塊的大小也就是乙個資料頁的大小,是固定的,如果資料項佔的空間越小,資料項的數量越多,樹的高度越低。這就是為什麼每個資料項,即索引欄位要盡量的小,比如int佔4位元組,要比bigint8位元組少一半。這也是為什麼b+樹要求把真實的資料放到葉子節點而不是內層節點,一旦放到內層節點,磁碟塊的資料項會大幅度下降,導致樹增高。當資料項等於1時將會退化成線性表。

2、當b+樹的資料項是復合的資料結構,比如(name,age,***)的時候,b+數是按照從左到右的順序來建立搜尋樹的,比如當(張三,20,f)這樣的資料來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和***,最後得到檢索的資料;但當(20,f)這樣的沒有name的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候name就是第乙個比較因子,必須要先根據name來搜尋才能知道下一步去**查詢。比如當(張三,f)這樣的資料來檢索時,b+樹可以用name來指定搜尋方向,但下乙個欄位age的缺失,所以只能把名字等於張三的資料都找到,然後再匹配性別是f的資料了, 這個是非常重要的性質,即索引的最左匹配特性。

MySQL索引系列 Btree索引和hash索引

hash索引是根據hash結構的定義,只需要一次運算便可以找到資料所在位置,不像b 樹或者b樹需要從根結點出發尋找資料,所以hash索引的查詢效率理論上要高於b 樹索引,但是mysql中並沒有採用這一種索引,這是由於這種索引除查詢效率之外的缺陷是十分明顯的。hash索引的特點 hash索引包括鍵值 ...

MySQL的索引,B tree還是B tree

如果你用 show index from table 得到的index type為 btree 但是我們印象中不是應該是b 樹麼?這個鏈結裡給出了大概的解答 does mysql use b tree,b tree or both?b tree would be a very bad keyword...

MySQL索引演算法之B Tree

b tree索引 當人們談論索引的時候,如果沒有特別指明型別,那多半說的是b tree索引,它使用b tree資料結構來儲存資料。大多數mysql引擎都支援這種索引。archive 引擎是乙個例外 5.1之前archive不支援任何索引,直到5.1才開始支援單個自增列 auto increment ...