mysql為什麼用b 樹做索引

2022-08-19 05:00:17 字數 1729 閱讀 2686

關鍵字就是key的意思

1、定義任意非葉子結點最多只有m個兒子,且m>2;

2、根結點的兒子數為[2, m];

3、除根結點以外的非葉子結點的兒子數為[m/2, m];

4、每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)

5、非葉子結點的關鍵字個數=指向兒子的指標個數-1;

6、非葉子結點的關鍵字:k[1], k[2], …, k[m-1];且k[i] < k[i+1];

7、非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;

8、所有葉子結點位於同一層;

b+樹的性質(下面提到的都是和b樹不相同的性質)

1、非葉子節點的子樹指標與關鍵字個數相同;

2、非葉子節點的子樹指標p[i],指向關鍵字值屬於[k[i],k[i+1]]的子樹.(b樹是開區間,也就是說b樹不允許關鍵字重複,b+樹允許重複);

3、為所有葉子節點增加乙個鏈指標;

4、所有關鍵字都在葉子節點出現(稠密索引). (且鍊錶中的關鍵字恰好是有序的);

5、非葉子節點相當於是葉子節點的索引(稀疏索引),葉子節點相當於是儲存(關鍵字)資料的資料層;

6、更適合於檔案系統;

1、 b+樹的磁碟讀寫代價更低:b+樹的內部節點並沒有指向關鍵字具體資訊的指標,因此其內部節點相對b樹更小,如果把所有同一內部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查詢的關鍵字也就越多,相對io讀寫次數就降低了。

2、b+樹的查詢效率更加穩定:由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。

3、由於b+樹的資料都儲存在葉子結點中,分支結點均為索引,方便掃庫,只需要掃一遍葉子結點即可,但是b樹因為其分支結點同樣儲存著資料,我們要找到具體的資料,需要進行一次中序遍歷按序來掃,所以b+樹更加適合在區間查詢的情況,所以通常b+樹用於資料庫索引。

b樹在提高了io效能的同時並沒有解決元素遍歷的我效率低下的問題,正是為了解決這個問題,b+樹應用而生。b+樹只需要去遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作或者說效率太低。

查詢資料,最簡單的方式是順序查詢。但是對於幾十萬上百萬,甚至上億的資料庫查詢就很慢了。

所以要對查詢的方式進行優化,熟悉的二分查詢,二叉樹可以把速度提公升到o(log(n,2)),查詢的瓶頸在於樹的深度,最壞的情況要查詢到二叉樹的最深層,由於,每查詢深一層,就要訪問更深一層的索引檔案。在多達數g的索引檔案中,這將是很大的開銷。所以,盡量把資料結構設計的更為『矮胖』一點就可以減少訪問的層數。在眾多的解決方案中,b-/b+樹很好的適合。b-樹定義具體可以查閱,簡而言之就是中間節點可以多餘兩個子節點,而且中間的元素可以是乙個域。相比b-樹,b+樹的父節點也必須存在於子節點中,是其中最大或者最小元素,b+樹的節點只儲存索引key值,具體資訊的位址存在於葉子節點的位址中。這就使以頁為單位的索引中可以存放更多的節點。減少更多的i/o支出。因此,b+樹成為了資料庫比較優秀的資料結構,mysql中myisam和innodb都是採用的b+樹結構。不同的是前者是非聚集索引,後者主鍵是聚集索引,所謂聚集索引是實體地址連續存放的索引,在取區間的時候,查詢速度非常快,但同樣的,插入的速度也會受到影響而降低。聚集索引的物理位置使用鍊錶來進行儲存。

mysql 為什麼用B 樹做索引

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

為什麼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 樹高很多 面試...