資料庫索引為什麼使用B+樹?
概述
B tree: 二叉樹(Binary tree),每個節點只能儲存一個數。
B-tree:B樹(B-Tree,並不是B“減”樹,橫槓為連線符,容易被誤導)
B樹屬於多叉樹又名平衡多路查詢樹。每個節點可以多個數(由磁碟大小決定)。
B+tree 和 B*tree 都是 B-tree的變種
索引為什麼是用B樹呢?
一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O消耗,相對於記憶體存取,I/O存取的消耗要高几個數量級,所以評價一個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟I/O操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數。而B-/+/*Tree,經過改進可以有效的利用系統對磁碟的塊讀取特性,在讀取相同磁碟塊的同時,儘可能多的載入索引資料,來提高索引命中效率,從而達到減少磁碟IO的讀取次數。
不瞭解磁碟相關知識的可以檢視 硬碟基本知識(磁頭、磁軌、扇區、柱面)
下面通過示意圖來看一下,B-tree、B+tree、B*tree
B-tree
從圖中可以看出,B-tree 利用了磁碟塊的特性進行構建的樹。每個磁碟塊一個節點,每個節點包含了很關鍵字。把樹的節點關鍵字增多後樹的層級比原來的二叉樹少了,減少資料查詢的次數和複雜度。
B-tree巧妙利用了磁碟預讀原理,將一個節點的大小設為等於一個頁(每頁為4K),這樣每個節點只需要一次I/O就可以完全載入。
B-tree 的資料可以存在任何節點中。
B+tree
B+tree 是 B-tree 的變種,資料只能儲存在葉子節點。
B+tree 是 B-tree 的變種,B+tree 資料只儲存在葉子節點中。這樣在B樹的基礎上每個節點儲存的關鍵字數更多,樹的層級更少所以查詢資料更快,所有指關鍵字指標都存在葉子節點,所以每次查詢的次數都相同所以查詢速度更穩定;
如果每個節點能存放M個資料,每個節點的資料在M/2到M之間。預留出空間可以插入新的資料。
B*tree
B*tree 每個磁碟塊中又新增了對下一個磁碟塊的引用。這樣可以在當前磁碟塊滿時,不用擴容直接儲存到下一個臨近磁碟塊中。當兩個鄰近的磁碟塊都滿時,這兩個磁碟塊各分出1/3的資料重新分配一個磁碟塊,這樣這三個磁碟塊的資料都為2/3。
如果每個節點能存放M個資料,每個節點的資料在2M/3到M之間。預留出空間可以插入新的資料。
在B+樹的基礎上因其初始化的容量變大,使得節點空間使用率更高,而又存有兄弟節點的指標,可以向兄弟節點轉移關鍵字的特性使得B*樹額分解次數變得更少;
想了解更多精彩內容請關注我的公眾號
相關文章
- 資料庫索引為什麼用B+樹實現?資料庫索引
- MySQL索引為什麼使用B+樹?MySql索引
- Mysql索引資料結構為什麼是B+樹?MySql索引資料結構
- MySQL資料庫索引選擇使用B+樹MySql資料庫索引
- 徹底搞懂MySQL為什麼要使用B+樹索引MySql索引
- 面試題:MySQL索引為什麼用B+樹?面試題MySql索引
- 來看看程式設計師經典面試題,為什麼資料庫索引多用B+樹程式設計師面試題資料庫索引
- MySQL為什麼採用B+樹作為索引結構?MySql索引
- Mysql InnoDB B+樹索引和雜湊索引的區別? MongoDB 為什麼使用B-樹?MySql索引MongoDB
- B 樹和 B+樹的區別, 為什麼 MySQL 要使用 B+樹MySql
- MySQL為什麼選B+樹MySql
- 為什麼選擇b+樹作為儲存引擎索引結構儲存引擎索引
- 面試 (MySQL 索引為啥要選擇 B+ 樹)面試MySql索引
- mysql索引為啥要選擇B+樹 (下)MySql索引
- mysql索引為啥要選擇B+樹 (上)MySql索引
- 搞懂MySQL InnoDB B+樹索引MySql索引
- 【Mysql】InnoDB 中的 B+ 樹索引MySql索引
- 為什麼有時Oracle資料庫不用索引來查詢資料?(轉)Oracle資料庫索引
- 資料結構之「B+樹」資料結構
- 主鍵為聯合主鍵時,索引B+樹結構索引
- 為什麼資料庫欄位要使用NOT NULL?資料庫Null
- 【資料結構】B樹、B+樹詳解資料結構
- 雜湊,二叉樹,紅黑樹,B樹,B+樹,LSM樹等資料結構做索引比較二叉樹資料結構索引
- MySQL索引-B+樹(看完你就明白了)MySql索引
- 為資料庫建立索引(轉)資料庫索引
- 是什麼影響了資料庫索引選型?資料庫索引
- Elasticsearch 中為什麼選擇倒排索引而不選擇 B 樹索引Elasticsearch索引
- PG資料庫為什麼要用autovacuum資料庫
- 資料庫倉庫系列:(一)什麼是資料倉儲,為什麼要資料倉儲資料庫
- [資料庫]資料庫中為什麼不推薦使用外來鍵約束資料庫
- 時序資料庫-01-時序資料庫有哪些?為什麼要使用資料庫
- MySQL實戰 | 為什麼要使用索引?MySql索引
- 跳槽必看MySQL索引:B+樹原理揭秘與索引優缺點分析MySql索引
- 什麼是行為資料?企業為什麼要使用它?
- 什麼是資料庫?什麼是雲資料庫?資料庫
- 資料庫索引是什麼?新華字典來幫你資料庫索引
- 為什麼索引無法使用is null和is not null索引Null
- (轉)Oracle為什麼不使用我的索引?Oracle索引