MySQL為什麼選擇B 樹做索引

2021-10-08 16:31:06 字數 1367 閱讀 6324

b tree的基本概念:所有的葉子節點的高度都是一樣,這個保證了每次查詢資料的時候都是穩定的查詢效率,不會因為運氣的影響

b tree中其實每個非葉子節點內的小節點內其實都是乙個二元組[key, data],key其實就是下圖的那個25這種的,然後這個data其實對應的就是資料庫中id等於25這條完整的資料記錄的記憶體位址(因為在myisam中他是資料和索引資料是分開的)

b樹的特點:

首先b tree的每乙個節點上其實是有date的,這個date其實就是要查詢的資料

然後是b tree查詢的效率不夠穩定,他有可能在第乙個節點中就查到了資料,並且返回

他的鍵值(索引和對應的值)其實都是分布在整棵樹上的節點上的任何乙個節點

在b+樹中,所有的非葉子節點不儲存要查詢的data資料,只儲存索引所有要查詢的data資料只存放在在葉子節點上

葉子節點之間的資料是乙個雙向鍊錶(互相指向)

下圖的一顆b樹,是乙個高度為2,每一頁可以放4條記錄,扇出是5。

b+ tree有乙個很大的改變就是他的每乙個非葉子節點的內節點中都沒有date這個概念了,都儲存索引資料,因為他的date都放在了葉子節點上,這樣的乙個最大的好處就利用了區域性性原理(當乙個資料被用到時,其附近的資料也通常會馬上被使用)

磁碟預讀原理:

由於上面我們說的預讀原理,因為b+ tree中節點的非葉子節點無 data 域,其實就是因為沒有date域了,但是每次io的頁的大小是固定的,但是b+tree中非葉子節點無date域,那麼肯定每次io讀取若干個塊塊中包含的key域的值肯定更多,b+樹單次磁碟 io 的資訊量大於b樹,從這點來看b+樹相對b樹磁碟 io 次數少。

資料庫系統的設計者巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入

為了達到這個目的在實際實現b-tree還需要使用如下技巧:每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。

b+tree中因為資料都在葉子節點,所以每次查詢的時間複雜度是固定的,因為穩定性保證了

而且葉子節點之間都是鍊錶的結構,所以b+ tree也是可以支援範圍查詢的,而b樹每個節點 key 和 data 在一起,則無法區間查詢。

mysql 為什麼用B 樹做索引

平衡二叉樹,2 3 4樹,紅黑樹都是平衡的,為什麼不能用來做innodb的索引呢?索引是存在於索引檔案中,是存在於磁碟中的,索引通常是很大的,因此無法一次將全部索引載入到記憶體當中,每次只能從磁碟中讀取乙個磁碟頁的資料到記憶體中,磁碟的讀取速度較記憶體中的讀取速度而言是差了好幾個級別的 邏輯結構上相...

MySQL 為什麼使用B 樹做索引結構

官方 索引是幫助mysql高效獲取資料的排好序的資料結構 mysql底層索引用的並不是完全的b樹,而是在b樹上做了一些改進得到的變種,也就是b 樹。非葉子節點不儲存data,只儲存索引 冗餘 可以放置更多的索引 葉子節點包含所有索引字段 葉子節點用雙向指標連線,提高區間訪問的效能 橫向可以儲存更多的...

mysql為什麼用b 樹做索引

關鍵字就是key的意思 1 定義任意非葉子結點最多只有m個兒子,且m 2 2 根結點的兒子數為 2,m 3 除根結點以外的非葉子結點的兒子數為 m 2,m 4 每個結點存放至少m 2 1 取上整 和至多m 1個關鍵字 至少2個關鍵字 5 非葉子結點的關鍵字個數 指向兒子的指標個數 1 6 非葉子結點...