国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

數據庫索引技術之B樹索引

運維 數據庫運維
跟我們在 LSM樹 一節中提到的 SSTable 一樣,B樹也是將數據組織成有序形式,因此支持范圍查詢。盡管如此,它們的底層結構卻完全不同,B樹有自己獨特的設計哲學。

[[437658]]

本文轉載自微信公眾號「小菜學編程」,作者fasionchan 。轉載本文請聯系小菜學編程公眾號。

前面我們介紹了 哈希索引 和 LSM樹索引 ,它們都基于日志結構式的數據文件。雖然工程界對這種索引的認可度正與日俱增,但還遠不是最受歡迎的索引技術。

那么,目前應用最廣的索引技術又是什么呢?

您可能早就有所耳聞——這就是本文要探討的 B樹( b-tree )索引。B樹可以說是數據庫索引技術中的武林盟主,能夠幾十年長盛不衰,必定有它自己的獨門秘訣。

索引結構

跟我們在 LSM樹 一節中提到的 SSTable 一樣,B樹也是將數據組織成有序形式,因此支持范圍查詢。盡管如此,它們的底層結構卻完全不同,B樹有自己獨特的設計哲學。

日志結構式索引將數據分成大小可調節的分段,通常是幾兆或更大,然后再順序寫入磁盤。而B樹則是以 塊( block )為單位來組織數據,塊大小是固定的,通常是 4KB ,也可以更大。這種設計更貼近磁盤的硬件結構,因為磁盤也是以塊為單位來讀寫數據的。

出于性能方面考慮,計算機通常以一定字節數(如 4KB )為單位來存取數據。在不同的場景有不同的叫法:磁盤數據一般稱為 塊 ( block ),內存數據一般稱為 頁( page )。這兩種場景數據庫均有涉及,因而術語可以混用。

磁盤中的每個數據塊都有一個唯一的地址,因此數據塊間可以互相引用,有點像內存中的指針。因此,我們可以用這種方式,將數據塊組織成一棵樹——B樹( b-tree )。

如上圖,為簡化討論,我們假設數據庫記錄只有兩個字段:一個是索引鍵,類型為整數;另一個是值。數據按索引鍵排序,依次保存在一個數據塊中,如藍色數據塊所示。

紫色部分數據塊為索引,它將索引鍵的范圍劃分為多個區間;每個區間保存著另一個數據塊的地址( ref ),表示該范圍內的數據,可以通過 ref 指向的數據塊找到。上圖中紅色的 ref 表示, 之間的數據,可以通過其左下方的另一個索引數據塊找到。

如果子范圍內的數據記錄還很多,單個數據塊容納不下,ref 便指向另一個索引塊,進一步將數據范圍分小;如果子范圍內的數據記錄不多,一個數據塊就能裝下,ref 便直接指向數據。

這樣一來,ref 就將數據塊組織成一棵多叉樹,數據塊主要分為兩種:

  • 一種用于保存數據記錄,如上圖藍色部分,位于樹的 葉子節點 ,簡稱 數據塊 ;
  • 一種用于保存索引,如上圖紫色部分,位于樹的的 內部節點,簡稱 索引塊 ;

從樹的根節點索引塊出發,根據數據鍵所在范圍的 ref 逐層往下找,即可定位到數據記錄。舉個例子,當查詢鍵為 400 的記錄時,搜索路徑如綠色箭頭線所示:

從根索引塊出發,400 落在區間 [343, 470) ,根據該區間 ref 找到下一級;

來到下一個索引塊,400 落在區間 [384, 412) ,根據該區間 ref 找到下一級;

最終來到藍色的數據塊,待查找的數據記錄就在里面;

范圍查詢

為了支持范圍查詢,數據庫將數據記錄排過序后才保存到數據塊,相鄰數據塊間則通過雙向鏈表指針連接在一起。

這樣一來,數據庫只要先定位邊界元素,然后以此為起點遍歷數據即可:

如果查詢條件為小于,則從后往前遍歷數據;

如果查詢條件為大于,則從前往后遍歷數據;

如上圖,以查詢大于等于 400 且小于 420 的數據為例:

數據庫定位到鍵值為 400 的數據記錄,如紅框所示;

數據庫檢查本數據塊內 400 以后的記錄,滿足小于 420 則取出;

數據庫根據鏈表指針找到下一個數據塊,繼續檢查里面的數據記錄,滿足小于 420 則取出;

數據庫重復步驟 3 ,逐個往后遍歷數據塊,直到有數據記錄大于等于 420 ;

分支因子

我們注意到,B樹是一種多叉樹。那么,為什么不能用最簡單的二叉樹呢?

實際上,每個樹節點最多可以有多少個分叉,是樹的一個非常重要的特性—— 分支因子( branching factor )。我們知道,在數據記錄數一定的前提下,樹的分支因子越大,高度越低。

我們使用排序樹來查找數據時,從根節點開始不斷搜索,最終來到葉子節點。換句話講,我們需要檢查的節點數,其實就是樹的高度。

而數據庫數據需要持久化并保存在磁盤里面,那磁盤有什么特點呢?

  • 磁盤 IO 比較慢,非順序的磁盤 IO 更是如此;
  • 磁盤 IO 以 塊( block )為數據單位,單次 IO 總是讀寫整個塊;

在排序樹中搜索數據,顯然是離散讀,而不是順序讀。因為我們無法保證 ref 指向的數據塊就在當前塊后面,磁盤通常只能重新 尋道( seek )后才能讀取數據。由于磁盤尋道很慢很慢,IO 次數必須盡量減少,因此樹的高度應該盡量壓低。

另一方面,磁盤以塊為單位讀寫數據,一個塊可以保存很多分支信息。如果一個塊只保存兩個分支,那就浪費了。因為就算只保存兩個分支,讀的時候還是必須整塊讀,開銷是一樣的。因此,不如盡量提高分支數,這樣還能減低樹的高度,進而減少 IO 次數。

通常 4KB 大的數據塊可以保存多達 500 個分支,如果樹的高度為 3 ,可以支撐多達 個數據,超過一億。有意思的是數據庫根索引塊通常緩存在內存中,這樣只需 2 次 IO 操作即可從超過 1 億數據中找到想要的那個。

綜上所述,B樹幾乎就是為磁盤量身定制的數據結構,它充分地利用了磁盤的特點:

磁盤以塊為單位讀寫數據,B樹就以塊為節點,組織成多叉樹;

磁盤 IO 很慢,B樹就通過提高分支因子,降低樹的高度,減少 IO 次數;

寫操作

數據庫寫操作分為兩種,一種是 更新( update ),一種是 插入( insert )。

如果要更新數據庫中的已有記錄,先搜索B樹找到包含該記錄的數據塊(葉子節點)。然后修改數據塊的記錄值,再將個數據塊寫回磁盤。由于數據塊只是內容改變了,位置不變,因此B樹中任何對該數據塊的引用仍然有效。

如果要插入一條新記錄,同樣先搜索B樹,找到數據范圍包含新記錄的數據塊(葉子節點)。如果數據塊還有足夠空間,就將新記錄添加進入并保存到磁盤即可。如果數據塊空閑空間不足,則需要將其分裂為兩個:

如上圖,以插入 399 為例:由于目標數據塊已經存滿,需要將其分裂為兩個。分裂后的數據塊都只有一半數據,新記錄保存在其中的一個。

如果新記錄的鍵相對較小,則保存在左邊的數據塊;否則就保存在右邊的數據塊。399 跟該范圍的其他數據相比較小,因此保存在左邊數據塊。

由于數據塊發生了分裂,因此它們的父節點需要更新,以便記錄最新的數據范圍和分支信息。

B樹算法可以保證樹的 平衡( balanced ):一棵包含 個鍵的B樹,高度不超過 ,否則樹的性能會大打折扣。通常一棵 3 層或 4 層深的B樹即可容納數據庫所有數據,因此查詢時無須遍歷太多數據塊,性能相對較好。

至此,三種主流的數據庫索引技術已經全部介紹完畢。除了本節介紹的B樹索引,其他兩種分別是:

 

  • 哈希索引
  • LSM樹索引

 

責任編輯:武曉燕 來源: 小菜學編程
相關推薦

2021-11-12 05:00:00

數據庫索引技術

2021-11-01 23:57:03

數據庫哈希索引

2023-11-06 11:18:22

數據庫索引B 樹

2019-03-14 09:51:50

MySQL存儲邏輯架構

2025-08-06 00:00:00

2019-08-29 10:46:22

MySQL索引數據庫

2020-04-01 18:08:57

MySQL B-樹B+樹

2019-07-03 09:16:30

數據庫原理二叉樹

2011-03-16 08:54:45

Oracle數據庫索引

2009-11-20 17:10:43

Oracle B樹索引

2020-03-18 09:33:47

數據庫程序員數組

2021-03-27 11:05:24

數據庫索引MySQL

2023-12-20 12:49:05

索引數據檢索數據庫

2021-04-09 08:21:25

數據庫索引數據

2019-01-29 19:43:10

MySQL索引數據庫

2021-02-16 16:38:41

MySQLB+樹索引

2011-08-19 13:28:25

海量數據索引優化

2010-05-26 13:42:08

MySQL數據庫索引

2019-09-24 09:33:53

MySQLB+樹InnoDB

2024-11-19 08:40:18

點贊
收藏

51CTO技術棧公眾號

香蕉视频免费版| 日本一区二区三区在线视频| heyzo在线播放| 国产目拍亚洲精品99久久精品| 国产精品中出一区二区三区| av亚洲在线观看| 久久久免费电影| 成人一区视频| 亚洲性夜色噜噜噜7777| 污网站在线免费看| 91麻豆精品久久久久蜜臀| 黄色片在线免费观看| 性欧美疯狂xxxxbbbb| 国产视频二区| 亚洲在线视频网站| 免费看成年人视频在线观看 | 一级片在线播放| 亚洲国产精品久久人人爱蜜臀 | 91精品国产色综合| 在线精品国产亚洲| 欧美精品在线免费播放| 成人在线视频www| 欧美成在线视频| 电影一区二区在线观看| 91精品国产高清| 亚洲品质自拍| 国产精品综合久久久| 亚洲精品97| 激情五月综合色婷婷一区二区 | 国内精品在线播放| 在线观看成人av电影| 激情成人综合网| h无码动漫在线观看| 久久综合五月天婷婷伊人| 青青在线免费观看视频| 中文字幕欧美日韩一区| 国产主播在线资源| 色诱亚洲精品久久久久久| 91在线网址| 亚洲跨种族黑人xxx| 9.1麻豆精品| 欧美精品电影在线| 女优一区二区三区| 国内精品久久国产| 国产乱码字幕精品高清av | 北岛玲一区二区三区| 欧美本精品男人aⅴ天堂| 久久91导航| 热草久综合在线| 99精品热视频只有精品10| 中文有码久久| 中文字幕一区在线| 成a人片在线观看www视频| 亚洲成成品网站| 成人自拍在线| 精品国产乱码久久久久| 成人午夜伦理影院| 黄网站app在线观看大全免费视频| 欧美日韩一区二区三区高清| 波多视频一区| 国产91在线高潮白浆在线观看| 亚洲一级网站| 国产精品无码人妻一区二区在线| 亚洲精品欧美专区| caoprom在线| 欧美中文字幕在线观看| 丝袜亚洲另类欧美| 91福利国产成人精品播放| 欧美日韩精品一区二区三区| 亚洲欧洲专区| 国产v亚洲v天堂无码| 成人综合婷婷国产精品久久蜜臀 | 波多野结衣久草一区| 久久爱另类一区二区小说| www.99av| 精品国产91洋老外米糕| 日本成人7777| 丰满女人性猛交| 精品国产91久久久| 久久av日韩| 日本高清久久一区二区三区| 日韩毛片精品高清免费| 俺来也官网欧美久久精品| 日本成熟性欧美| 国内外成人在线| 日本人妖在线| 欧美韩国理论所午夜片917电影| 在线欧美福利| 人人在线97| 久久久精品国产一区二区| 久久99伊人| 在线观看av每日更新免费| 精品视频9999| 国内精品在线播放| aaa日本高清在线播放免费观看| 欧美激情视频在线观看| 精品亚洲aⅴ乱码一区二区三区| 九色网友自拍视频手机在线| 26uuu国产精品视频| av亚洲精华国产精华| 色yeye免费人成网站在线观看| 91精品视频免费观看| 综合久久给合久久狠狠狠97色| 韩国成人动漫| 久久精品欧美| 色婷婷亚洲综合| 欧美军人男男激情gay| 另类小说第一页| 菠萝蜜影院一区二区免费| 毛片一区二区三区| av在线影院| 九色91视频| 在线免费精品视频| 天天超碰亚洲| 色哟哟在线观看| 国产在线视频一区| 亚洲一区免费观看| 香蕉久久精品| 免费的av电影| 久久久久久69| 久久综合久久99| 久久久人成影片一区二区三区在哪下载| 欧美xxxx黑人又粗又长精品| 色噜噜狠狠一区二区三区果冻| 欧美gayvideo| 污视频在线观看免费| 成人做爰www免费看视频网站| 一区二区三区中文字幕| 老司机精品在线| 调教视频vk| 日韩av毛片网| 亚洲成人免费电影| 亚洲v在线看| 午夜伦全在线观看| 欧美日韩三区四区| 亚洲精品一区二区三区福利| 久久精品国产在热久久| 桃色av一区二区| 国产精品69久久久| 中文字幕免费国产精品| 99re成人在线| 精品成人自拍视频| 欧美精品一区二区三区涩爱蜜| 91在线视频免费| 欧美一区二区三区四区视频 | 高清国产在线一区| 欧美精品在线观看播放| 日韩精品1区2区3区| 亚洲wwww| 国产成人无码一二三区视频| 韩国视频理论视频久久| 亚洲香蕉伊在人在线观| 欧美精品偷拍| 麻豆成全视频免费观看在线看| 蜜臀精品一区二区| 国外成人免费在线播放| 亚洲高清一区二区三区| 99成人精品| 国产伦子伦对白在线播放观看| 日本丰满少妇xxxx| 全亚洲最色的网站在线观看| 91黄色小视频| 国产成人综合亚洲91猫咪| 国产精品久久久久久久久久白浆| 在线人体午夜视频| 色综合久久久久久久久五月| 正在播放欧美视频| 亚洲一区二区在线观看视频| 亚洲在线播放| 亚洲成av人片在线观看www| 在线观看午夜看亚太视频| 激情欧美一区二区三区中文字幕| 亚洲精品国产成人| 中文字幕视频一区| 亚洲日本视频| av在线播放一区二区| 日韩一二三四| www.亚洲成人网| 91精品久久久久久久| 亚洲精品视频中文字幕| 亚洲欧美国产高清| 亚洲精品少妇| 日韩精品久久久久久久软件91| 亚洲热app| 人妻av无码专区| 成人激情av在线| 国产一区二区三区视频在线观看| 亚洲国产日韩a在线播放| 日韩电影在线观看一区| 日韩欧美ww| sm国产在线调教视频| 欧美日韩在线不卡视频| 成人免费在线看片| 超碰精品一区二区三区乱码| 色成年激情久久综合| av激情综合网| 羞羞答答国产精品www一本| 欧美一级三级| 欧美亚洲二区| 黄色羞羞视频在线观看|