mysql 為什麼用B 樹做索引

2021-10-19 13:17:38 字數 2032 閱讀 3138

平衡二叉樹,2-3-4樹,紅黑樹都是平衡的,為什麼不能用來做innodb的索引呢?

索引是存在於索引檔案中,是存在於磁碟中的,索引通常是很大的,因此無法一次將全部索引載入到記憶體當中,每次只能從磁碟中讀取乙個磁碟頁的資料到記憶體中,磁碟的讀取速度較記憶體中的讀取速度而言是差了好幾個級別的

邏輯結構上相近的節點在物理結構上很可能會差很遠,就是雖然我們儲存的時候,儲存的資料是連續的,但是再資料庫中儲存的卻不是連續在一塊的。每次讀取的磁碟頁的資料中有許多是用不上的,查詢過程中要進行許多次的磁碟讀取操作,適合作為索引的結構應該是盡可能少的執行磁碟io操作,平衡二叉樹沒能充分利用磁碟預讀功能,因此以上這些平衡的二叉樹並不適合作為索引結構

b樹:b樹是為了充分利用磁碟預讀功能而建立的一種資料結構,它是為了索引而誕生的。

特點:每個節點最多有m-1個關鍵字(可以存有的鍵值對),根節點最少可以只有1個關鍵字,非根節點至少要有m/2個關鍵字,每個根節點中的關鍵字都按照從小到大的順序排列,每個關鍵字的左子樹中的所有元素都小於它,右子樹的元素都大於它,所有葉子節點都位於同一層,或者說根節點到每個葉子節點的長度都相同,每個節點都存有索引和資料,也就是對應的key和value,根節點的關鍵字數量範圍:1<=k<=m-1,非根節點的關鍵字數量範圍:m/2<=k<=m-1

區域性性原理與磁碟預讀

由於儲存介質的特性,磁碟本身讀取就比主存慢很多,再加上機械運動耗費,磁碟的訪問速度往往是主存的幾百分之一,因此為了提高效率要儘量減少磁碟i/o。為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀。即使需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體,這樣做的理論依據是電腦科學中的著名的區域性性原理

b樹的每個節點可以儲存多個關鍵字,它將節點大小設定為磁碟頁的大小,充分利用了磁碟預讀的功能,每次讀取磁碟頁時就會讀取一整個節點,也正因每個節點儲存這非常多個關鍵字,樹的深度就會非常小,進而要執行的磁碟讀取操作次數就會非常少,更多的是在記憶體中對讀取進來的資料進行查詢。

b樹的查詢,主要發生在記憶體中,而平衡二叉樹的查詢,則是發生在磁碟讀取中,因此雖然b樹的查詢次數不比平衡二叉樹的次數少,但是相比起磁碟io速度,記憶體中的比較耗時就可以忽略不計了,因此,b樹更適合作為索引。

b+樹:比b樹更適合作為索引的結構是b+樹,mysql也是使用b+樹作為索引的,它是b樹的變種,因此是基於b樹來改進的,為什麼b+樹會比b樹更加優秀呢?

看他們的資料組成結構

b樹:有序陣列+平衡多叉樹

b+樹:有序陣列鍊錶+平衡多叉樹

b樹與b+樹的不同之處

1.b+樹非葉子節點不存放資料,只存放keys

2.b+樹的葉子節點之間存在指標相連,而且是單鏈表

列舉乙個例子:查詢key的範圍在3-7之間的所有的關鍵字

b樹的表現:找到第乙個符合條件的數字3後,讀取這個塊的內容,繼續遍歷b樹,獲得其他塊的資料。

b+樹的表現: 由於葉子節點有指向下乙個節點的指標,因此從塊1到塊2的訪問,通過塊1指向塊2的指標即可,從塊2到塊3也是通過乙個指標即可,無需頻繁的遍歷b樹

資料索引採用b+樹的主要原因是:

在資料庫中基於範圍的查詢是非常頻繁的,因此mysql最終選擇的索引是b+樹

mysql除了使用b+樹的索引外,還使用了雜湊索引

全文索引引起索引失效的原因

查詢條件中的索引列使用 is null ,不會走索引

如果條件中有 or ,且部分條件不是索引列,不會走索引

多列組合索引,不滿足最左原則,不會走索引

like查詢以%開頭的列,不會走索引

如果列型別是字串,如果在條件中資料未使用引號引用起來,則不會走索引

如果資料庫引擎估計使用全表掃瞄比使用索引快,不會走索引

如果查詢語句使用不等於 查詢條件, 不會走索引

對索引字段進行計算操作,欄位上使用函式,不會走索引

盡量使用覆蓋索引(只訪問索引的查詢(索引列與查詢列一致)),減少select *

mysql為什麼用b 樹做索引

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

為什麼Mysql用B 樹做索引而不用B 樹

先從資料結構的角度來答。題主應該知道b 樹和b 樹最重要的乙個區別就是b 樹只有葉節點存放資料,其餘節點用來索引,而b 樹是每個索引節點都會有data域。這就決定了b 樹更適合用來儲存外部資料,也就是所謂的磁碟資料。從mysql inoodb 的角度來看,b 樹是用來充當索引的,一般來說索引非常大,...

MySQL為什麼用B 樹,而不用B樹?

面試題1 mysql為什麼用b 樹,而不用b樹?1.b 樹只有葉子節點存資料 b樹是每個節點都存資料 在相同資料量下b樹的高度更高,所以查詢效率更低 2.b樹每一層存的是資料 索引 b 樹是除了葉子節點存的是資料 索引以外,其餘節點只存索引,所以在相同資料量的情況下,b樹的高度會比b 樹高很多 面試...