mysql 使用B+樹索引有哪些優(yōu)勢
搞懂這個問題之前,我們首先來看一下MySQL表的存儲結構,再分別對比二叉樹、多叉樹、B樹和B+樹的區(qū)別就都懂了。
MySQL的存儲結構表存儲結構單位:表>段>區(qū)>頁>行
在數(shù)據(jù)庫中, 不論讀一行,還是讀多行,都是將這些行所在的頁進行加載。也就是說存儲空間的基本單位是頁。一個頁就是一棵樹B+樹的節(jié)點,數(shù)據(jù)庫I/O操作的最小單位是頁,與數(shù)據(jù)庫相關的內容都會存儲在頁的結構里。
B+樹索引結構有以下幾個特點
將所有的記錄分成幾個組, 每組會存儲多條記錄, 頁目錄存儲的是槽(slot),槽相當于分組記錄的索引,每個槽指針指向了不同組的最后一個記錄 我們通過槽定位到組,再查看組中的記錄頁的主要作用是存儲記錄,在頁中記錄以單鏈表的形式進行存儲。單鏈表優(yōu)點是插入、刪除方便,缺點是檢索效率不高,最壞的情況要遍歷鏈表所有的節(jié)點。因此頁目錄中提供了二分查找的方式,來提高記錄的檢索效率。
B+樹的檢索過程我們再來看下B+樹的檢索過程
從B+樹的根開始,逐層找到葉子節(jié)點。 找到葉子節(jié)點為對應的數(shù)據(jù)頁,將數(shù)據(jù)葉加載到內存中,通過頁目錄的槽采用二分查找的方式先找到一個粗略的記錄分組。 在分組中通過鏈表遍歷的方式進行記錄的查找。為什么要用B+樹索引數(shù)據(jù)庫訪問數(shù)據(jù)要通過頁,一個頁就是一個B+樹節(jié)點,訪問一個節(jié)點相當于一次I/O操作,所以越快能找到節(jié)點,查找性能越好。B+樹的特點就是夠矮夠胖,能有效地減少訪問節(jié)點次數(shù)從而提高性能。
下面,我們來對比一個二叉樹、多叉樹、B樹和B+樹。
二叉樹二叉樹是一種二分查找樹,有很好的查找性能,相當于二分查找。但是當N比較大的時候,樹的深度比較高。數(shù)據(jù)查詢的時間主要依賴于磁盤IO的次數(shù),二叉樹深度越大,查找的次數(shù)越多,性能越差。最壞的情況是退化成了鏈表,如下圖
為了讓二叉樹不至于退化成鏈表,人們發(fā)明了AVL樹(平衡二叉搜索樹):任何結點的左子樹和右子樹高度最多相差1
多叉樹多叉樹就是節(jié)點可以是M個,能有效地減少高度,高度變小后,節(jié)點變少I/O自然少,性能比二叉樹好了
B樹B樹簡單地說就是多叉樹,每個葉子會存儲數(shù)據(jù),和指向下一個節(jié)點的指針。
例如要查找9,步驟如下
我們與根節(jié)點的關鍵字 (17,35)進行比較,9 小于 17 那么得到指針 P1; 按照指針 P1 找到磁盤塊 2,關鍵字為(8,12),因為 9 在 8 和 12 之間,所以我們得到指針 P2; 按照指針 P2 找到磁盤塊 6,關鍵字為(9,10),然后我們找到了關鍵字 9。 B+樹B+樹是B樹的改進,簡單地說是:只有葉子節(jié)點才存數(shù)據(jù),非葉子節(jié)點是存儲的指針;所有葉子節(jié)點構成一個有序鏈表
B+樹的內部節(jié)點并沒有指向關鍵字具體信息的指針,因此其內部節(jié)點相對B樹更小,如果把所有同一內部節(jié)點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數(shù)量也越多,一次性讀入內存的需要查找的關鍵字也就越多,相對IO讀寫次數(shù)就降低了
例如要查找關鍵字16,步驟如下
與根節(jié)點的關鍵字 (1,18,35) 進行比較,16 在 1 和 18 之間,得到指針 P1(指向磁盤塊 2) 找到磁盤塊 2,關鍵字為(1,8,14),因為 16 大于 14,所以得到指針 P3(指向磁盤塊 7) 找到磁盤塊 7,關鍵字為(14,16,17),然后我們找到了關鍵字 16,所以可以找到關鍵字 16 所對應的數(shù)據(jù)。B+樹與B樹的不同:
B+樹非葉子節(jié)點不存在數(shù)據(jù)只存索引,B樹非葉子節(jié)點存儲數(shù)據(jù) B+樹查詢效率更高。B+樹使用雙向鏈表串連所有葉子節(jié)點,區(qū)間查詢效率更高(因為所有數(shù)據(jù)都在B+樹的葉子節(jié)點,掃描數(shù)據(jù)庫 只需掃一遍葉子結點就行了),但是B樹則需要通過中序遍歷才能完成查詢范圍的查找。 B+樹查詢效率更穩(wěn)定。B+樹每次都必須查詢到葉子節(jié)點才能找到數(shù)據(jù),而B樹查詢的數(shù)據(jù)可能不在葉子節(jié)點,也可能在,這樣就會造成查詢的效率的不穩(wěn)定 B+樹的磁盤讀寫代價更小。B+樹的內部節(jié)點并沒有指向關鍵字具體信息的指針,因此其內部節(jié)點相對B樹更小,通常B+樹矮更胖,高度小查詢產生的I/O更少。這就是MySQL使用B+樹的原因,就是這么簡單!
以上就是mysql 使用B+樹索引有哪些優(yōu)勢的詳細內容,更多關于MySQL 使用B+樹索引的資料請關注好吧啦網其它相關文章!
相關文章:
1. Mariadb數(shù)據(jù)庫主從復制同步配置過程實例2. 解決Oracle模擬事務提交、表鎖,處理表鎖問題3. MySQL中 and or 查詢的優(yōu)先級分析4. Microsoft Office Access添加外鍵的方法5. MySQL中查詢json格式的字段實例詳解6. SQL SERVER2000中訂閱與發(fā)布的具體操作7. 如何:創(chuàng)建和運行 CLR SQL Server 用戶定義的函數(shù)8. Access 使用總結一篇9. 高并發(fā)狀態(tài)下Replace Into造成的死鎖問題解決10. short int、long、float、double使用問題說明
