精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

換一個角度看 B+ 樹

存儲 存儲軟件 數據庫運維
MySQL 支持多種存儲引擎,不同的存儲引擎,存儲數據的方式也是不同的,我們最常使用的是 InnoDB 存儲引擎,所以就跟大家圖解下InnoDB 是如何存儲數據的。

[[440384]]

本文轉載自微信公眾號「小林coding」,作者小林coding 。轉載本文請聯系小林coding公眾號。

大家好,我是小林。

大家背八股文的時候,都知道 MySQL 里 InnoDB 存儲引擎是采用 B+ 樹來組織數據的。

這點沒錯,但是大家知道 B+ 樹里的節點里存放的是什么呢?查詢數據的過程又是怎樣的?

這次,我們從數據頁的角度看 B+ 樹,看看每個節點長啥樣。

InnoDB 是如何存儲數據的?

MySQL 支持多種存儲引擎,不同的存儲引擎,存儲數據的方式也是不同的,我們最常使用的是 InnoDB 存儲引擎,所以就跟大家圖解下InnoDB 是如何存儲數據的。

記錄是按照行來存儲的,但是數據庫的讀取并不以「行」為單位,否則一次讀取(也就是一次 I/O 操作)只能處理一行數據,效率會非常低。

因此,InnoDB 的數據是按「數據頁」為單位來讀寫的,也就是說,當需要讀一條記錄的時候,并不是將這個記錄本身從磁盤讀出來,而是以頁為單位,將其整體讀入內存。

數據庫的 I/O 操作的最小單位是頁,InnoDB 數據頁的默認大小是 16KB,意味著數據庫每次讀寫都是以 16KB 為單位的,一次最少從磁盤中讀取 16K 的內容到內存中,一次最少把內存中的 16K 內容刷新到磁盤中。

數據頁包括七個部分,結構如下圖:

這 7 個部分的作用如下圖:

在 File Header 中有兩個指針,分別指向上一個數據頁和下一個數據頁,連接起來的頁相當于一個雙向的鏈表,如下圖所示:

采用鏈表的結構是讓數據頁之間不需要是物理上的連續的,而是邏輯上的連續。

數據頁的主要作用是存儲記錄,也就是數據庫的數據,所以重點說一下數據頁中的 User Records 是怎么組織數據的。

數據頁中的記錄按照「主鍵」順序組成單向鏈表,單向鏈表的特點就是插入、刪除非常方便,但是檢索效率不高,最差的情況下需要遍歷鏈表上的所有節點才能完成檢索。

因此,數據頁中有一個頁目錄,起到記錄的索引作用,就像我們書那樣,針對書中內容的每個章節設立了一個目錄,想看某個章節的時候,可以查看目錄,快速找到對應的章節的頁數,而數據頁中的頁目錄就是為了能快速找到記錄。

那 InnoDB 是如何給記錄創建頁目錄的呢?頁目錄與記錄的關系如下圖:

頁目錄創建的過程如下:

  • 將所有的記錄劃分成幾個組,這些記錄包括最小記錄和最大記錄,但不包括標記為“已刪除”的記錄;
  • 每個記錄組的最后一條記錄就是組內最大的那條記錄,并且最后一條記錄的頭信息中會存儲該組一共有多少條記錄,作為 n_owned 字段(上圖中粉紅色字段)
  • 頁目錄用來存儲每組最后一條記錄的地址偏移量,這些地址偏移量會按照先后順序存儲起來,每組的地址偏移量也被稱之為槽(slot),每個槽相當于指針指向了不同組的最后一個記錄。

從圖可以看到,頁目錄就是由多個槽組成的,槽相當于分組記錄的索引。然后,因為記錄是按照「主鍵值」從小到大排序的,所以我們通過槽查找記錄時,可以使用二分法快速定位要查詢的記錄在哪個槽(哪個記錄分組),定位到槽后,再遍歷槽內的所有記錄,找到對應的記錄,無需從最小記錄開始遍歷整個頁中的記錄鏈表。

以上面那張圖舉個例子,5 個槽的編號分別為 0,1,2,3,4,我想查找主鍵為 11 的用戶記錄:

  • 先二分得出槽中間位是 (0+4)/2=2 ,2號槽里最大的記錄為 8。因為 11 > 8,所以需要從 2 號槽后繼續搜索記錄;
  • 再使用二分搜索出 2 號和 4 槽的中間位是 (2+4)/2= 3,3 號槽里最大的記錄為 12。因為 11 < 12,所以主鍵為 11 的記錄在 3 號槽里;
  • 再從 3 號槽指向的主鍵值為 9 記錄開始向下搜索 2 次,定位到主鍵為 11 的記錄,取出該條記錄的信息即為我們想要查找的內容。

看到第三步的時候,可能有的同學會疑問,如果某個槽內的記錄很多,然后因為記錄都是單向鏈表串起來的,那這樣在槽內查找某個記錄的時間復雜度不就是 O(n) 了嗎?

這點不用擔心,InnoDB 對每個分組中的記錄條數都是有規定的,槽內的記錄就只有幾條:

  • 第一個分組中的記錄只能有 1 條記錄;
  • 最后一個分組中的記錄條數范圍只能在 1-8 條之間;
  • 剩下的分組中記錄條數范圍只能在 4-8 條之間。

B+ 樹是如何進行查詢的?

上面我們都是在說一個數據頁中的記錄檢索,因為一個數據頁中的記錄是有限的,且主鍵值是有序的,所以通過對所有記錄進行分組,然后將組號(槽號)存儲到頁目錄,使其起到索引作用,通過二分查找的方法快速檢索到記錄在哪個分組,來降低檢索的時間復雜度。

但是,當我們需要存儲大量的記錄時,就需要多個數據頁,這時我們就需要考慮如何建立合適的索引,才能方便定位記錄所在的頁。

為了解決這個問題,InnoDB 采用了 B+ 樹作為索引。磁盤的 I/O 操作次數對索引的使用效率至關重要,因此在構造索引的時候,我們更傾向于采用“矮胖”的 B+ 樹數據結構,這樣所需要進行的磁盤 I/O 次數更少,而且 B+ 樹 更適合進行關鍵字的范圍查詢。

更詳細的為什么采用 B+ 樹作為索引的原因可以看我之前寫的這篇:「索引為什么能提高查詢性能?」

InnoDB 里的 B+ 樹中的每個節點都是一個數據頁,結構示意圖如下:

通過上圖,我們看出 B+ 樹的特點:

  • 只有葉子節點(最底層的節點)才存放了數據,非葉子節點(其他上層節)僅用來存放目錄項作為索引。
  • 非葉子節點分為不同層次,通過分層來降低每一層的搜索量;
  • 所有節點按照索引鍵大小排序,構成一個雙向鏈表,便于范圍查詢;

我們再看看 B+ 樹如何實現快速查找主鍵為 6 的記錄,以上圖為例子:

  • 從根節點開始,通過二分法快速定位到符合頁內范圍包含查詢值的頁,因為查詢的主鍵值為 6,在[1, 7)范圍之間,所以到頁 30 中查找更詳細的目錄項;
  • 在非葉子節點(頁30)中,繼續通過二分法快速定位到符合頁內范圍包含查詢值的頁,主鍵值大于 5,所以就到葉子節點(頁16)查找記錄;
  • 接著,在葉子節點(頁16)中,通過槽查找記錄時,使用二分法快速定位要查詢的記錄在哪個槽(哪個記錄分組),定位到槽后,再遍歷槽內的所有記錄,找到主鍵為 6 的記錄。

可以看到,在定位記錄所在哪一個頁時,也是通過二分法快速定位到包含該記錄的頁。定位到該頁后,又會在該頁內進行二分法快速定位記錄所在的分組(槽號),最后在分組內進行遍歷查找。

聚集索引和二級索引

另外,索引又可以分成聚集索引和非聚集索引(二級索引),它們區別就在于葉子節點存放的是什么數據:

  • 聚集索引的葉子節點存放的是實際數據,所有完整的用戶記錄都存放在聚集索引的葉子節點;
  • 二級索引的葉子節點存放的是主鍵值,而不是實際數據。

因為表的數據都是存放在聚集索引的葉子節點里,所以 InnoDB 存儲引擎一定會為表創建一個聚集索引,且由于數據在物理上只會保存一份,所以聚簇索引只能有一個。

InnoDB 在創建聚簇索引時,會根據不同的場景選擇不同的列作為索引:

  • 如果有主鍵,默認會使用主鍵作為聚簇索引的索引鍵;
  • 如果沒有主鍵,就選擇第一個不包含 NULL 值的唯一列作為聚簇索引的索引鍵;
  • 在上面兩個都沒有的情況下,InnoDB 將自動生成一個隱式自增 id 列作為聚簇索引的索引鍵;

一張表只能有一個聚簇索引,那為了實現非主鍵字段的快速搜索,就引出了二級索引(非聚簇索引/輔助索引),它也是利用了 B+ 樹的數據結構,但是二級索引的葉子節點存放的是主鍵值,不是實際數據。

二級索引的 B+ 樹如下圖,數據部分為主鍵值:

因此,如果某個查詢語句使用了二級索引,但是查詢的數據不是主鍵值,這時在二級索引找到主鍵值后,需要去聚簇索引中獲得數據行,這個過程就叫作「回表」,也就是說要查兩個 B+ 樹才能查到數據。不過,當查詢的數據是主鍵值時,因為只在二級索引就能查詢到,不用再去聚簇索引查,這個過程就叫作「索引覆蓋」,也就是只需要查一個 B+ 樹就能找到數據。

總結

InnoDB 的數據是按「數據頁」為單位來讀寫的,默認數據頁大小為 16 KB。每個數據頁之間通過雙向鏈表的形式組織起來,物理上不連續,但是邏輯上連續。

數據頁內包含用戶記錄,每個記錄之間用單項鏈表的方式組織起來,為了加快在數據頁內高效查詢記錄,設計了一個頁目錄,頁目錄存儲各個槽(分組),且主鍵值是有序的,于是可以通過二分查找法的方式進行檢索從而提高效率。

為了高效查詢記錄所在的數據頁,InnoDB 采用 b+ 樹作為索引,每個節點都是一個數據頁。

如果葉子節點存儲的是實際數據的就是聚簇索引,一個表只能有一個聚簇索引;如果葉子節點存儲的不是實際數據,而是主鍵值則就是二級索引,一個表中可以有多個二級索引。

在使用二級索引進行查找數據時,如果查詢的數據能在二級索引找到,那么就是「索引覆蓋」操作,如果查詢的數據不在二級索引里,就需要先在二級索引找到主鍵值,需要去聚簇索引中獲得數據行,這個過程就叫作「回表」。

 

關于索引的內容還有很多,比如索引失效、索引優化等等,這些內容我下次在講啦!

 

責任編輯:武曉燕 來源: 小林coding
相關推薦

2017-03-06 15:05:57

2009-03-26 10:11:47

2023-11-28 16:17:20

數據庫MySQL

2019-08-29 10:46:22

MySQL索引數據庫

2020-04-01 18:08:57

MySQL B-樹B+樹

2023-08-29 08:31:13

B+樹數據索引

2023-07-31 09:12:39

B+樹節點B+Tree

2019-01-29 19:43:10

MySQL索引數據庫

2021-02-16 16:38:41

MySQLB+樹索引

2019-09-24 09:33:53

MySQLB+樹InnoDB

2024-11-19 08:40:18

2021-06-04 07:55:05

MySQLB+ 樹數據

2024-05-22 09:01:53

InnoDBB+索引

2021-05-19 09:51:31

MySQL-B+樹數據

2022-03-28 08:24:52

MySQL聚簇索引非聚簇索引

2021-04-19 10:03:33

MongoDbB 樹 B+ 樹

2019-09-19 14:03:32

B樹節點數據結構

2020-02-12 19:01:22

索引B-樹B+樹

2020-03-30 17:20:54

B+樹SQL索引

2025-11-03 16:30:44

點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久久久久久新郎 | 性刺激综合网| 国产精品无码粉嫩小泬| 久久裸体网站| 国产欧美日本一区视频| 亚洲国产精品悠悠久久琪琪| av天堂永久资源网| 91精品专区| 国产一区二区三区av电影| 欧美国产在线视频| 麻豆精品免费视频| 午夜av免费看| 人妻精品一区二区三区| 久久婷婷一区| 成人小视频在线| 综合欧美亚洲日本| 动漫一区二区在线| 亚洲欧美国产不卡| 亚洲乱码精品久久久久..| 新67194成人永久网站| 中文字幕亚洲第一| 亚洲天堂2024| 欧洲大片精品免费永久看nba| 国产成人精品一区二区无码呦| 黄色在线观看www| 91亚洲精品久久久蜜桃网站| www.久久国产| 中国日本在线视频中文字幕| 国产成人免费视频精品含羞草妖精| 国产精品扒开腿做爽爽爽男男 | 国产精品无遮挡| 国产日韩欧美一二三区| 手机看片国产精品| 女生影院久久| 亚洲地区一二三色| 懂色av粉嫩av蜜臀av| 欧洲一区av| av中文一区二区三区| 欧美日韩国产精品一区二区三区| xxx.xxx欧美| 亚洲欧洲精品一区二区三区 | 国产又粗又大又黄| 日韩国产成人精品| 26uuu日韩精品一区二区| 麻豆亚洲av熟女国产一区二| 亚洲一区二区人妻| 顶级网黄在线播放| 国产目拍亚洲精品99久久精品| 国产视频不卡| 国产91免费看| 99精品国产热久久91蜜凸| 国产精品一区二区欧美| 人妻少妇精品无码专区| 成人激情视频网站| 久久久久久高清| 欧美视频综合| 国产日韩欧美精品在线| 亚洲激情啪啪| av在线免费网址| 一区二区欧美精品| 国产日韩亚洲欧美在线| 免费电影视频在线看 | 亚洲精品午夜国产va久久成人| 亚洲黄页一区| 青青草99啪国产免费| 国产寡妇亲子伦一区二区三区四区| 国产精品人人爽人人做我的可爱| 98精品国产高清在线xxxx天堂| 日韩在线视频免费播放| 日韩高清在线观看| 91久久国产婷婷一区二区| 国产福利视频导航| 成人一区在线看| 美乳视频一区二区| av网站在线免费播放| 中文字幕日本不卡| 欧洲精品一区二区三区久久| 亚洲小少妇裸体bbw| 日本福利一区二区| 日韩视频在线观看一区二区三区| www国产精品| 亚洲视频欧美视频| 国产精品 欧美激情| 在线视频观看日韩| 国产精品久久久久免费a∨大胸| 91丨九色丨蝌蚪丨对白| 懂色av一区二区三区免费观看| 久久久久高清| 麻豆网站视频在线观看| 亚洲一二三四在线| 我要看一级黄色大片| 日韩区一区二| 中文字幕国产精品| 国产精品suv一区二区69| 日韩国产欧美在线视频| 亚洲专区国产精品| 免费资源在线观看| 依依成人精品视频| 男人舔女人下面高潮视频| 91久久久久久白丝白浆欲热蜜臀| 日韩精品最新网址| 日本一卡二卡在线播放| 亚洲午夜av| 国产91精品在线播放| 成 人片 黄 色 大 片| 国产喷白浆一区二区三区| 隔壁人妻偷人bd中字| 婷婷丁香久久| 亚洲美女久久久| 国产一级在线观看视频| 国产在线视频一区二区| 日韩一区二区电影在线观看| 国产蜜臀一区二区打屁股调教| 欧美色网一区二区| 一女三黑人理论片在线| 中出一区二区| 国产在线拍揄自揄视频不卡99| 日本v片在线免费观看| 亚洲最大的成人av| 亚洲制服中文字幕| 第九色区aⅴ天堂久久香| 97国产精品免费视频| 国产成人精品白浆久久69| 亚洲国产精品ⅴa在线观看| www一区二区www免费| 亚洲精品在线播放| 久国内精品在线| 97人妻人人澡人人爽人人精品 | 日韩伦理三区| 日韩av中文字幕在线播放| 激情综合五月网| 国产在线一区二区综合免费视频| 亚洲一区三区电影在线观看| 日韩三区在线| 亚洲视频免费一区| www.久久久久久久| 久久久一区二区三区捆绑**| 国产中文字幕乱人伦在线观看| 亚洲一区二区三区日本久久九| 精品国产欧美成人夜夜嗨| 亚洲视频在线观看免费视频| 亚洲国产精品二十页| 日本中文字幕高清| heyzo久久| 国产精品一区久久久| 国产视频网站在线| 欧美午夜视频网站| youjizz亚洲女人| 捆绑变态av一区二区三区| 日韩一本精品| 999色成人| 欧美成人合集magnet| 精品国产无码一区二区三区| 一区二区三区四区国产精品| www.黄色网| 在线观看一区视频| 免费在线国产精品| jizz欧美| 欧美久久精品一级黑人c片| 亚洲av无码国产精品永久一区| 一区二区三区成人| 中文在线永久免费观看| 久久精品动漫| 天天综合狠狠精品| 91精品一久久香蕉国产线看观看| 欧美成人网在线| 日本高清视频免费看| 日韩欧美在线字幕| 三级黄色录像视频| 成熟亚洲日本毛茸茸凸凹| 欧美牲交a欧美牲交| 精品少妇av| 川上优av一区二区线观看| 国产高清在线a视频大全| 亚洲精选中文字幕| 国产精品久久久久久69| 亚洲最新视频在线播放| 熟女少妇一区二区三区| 精品一区二区三区蜜桃| 黄网站欧美内射| 欧美精选一区二区三区| 99国产盗摄| 怡红院成人在线| 久久综合亚洲社区| 头脑特工队2免费完整版在线观看| 欧美私人免费视频| 五月天婷婷丁香| 中文字幕精品综合| 亚洲色图欧美另类| 日本少妇一区二区| 可以看毛片的网址| 三级电影一区| 美女亚洲精品| 亚洲成av人片在线观看www| 日本精品久久电影| 丝袜在线观看| 在线播放国产一区二区三区| www.日韩高清| 欧美在线一二三| 日本天堂在线视频| 亚洲欧洲精品一区二区三区不卡| 丰满少妇一区二区三区| 国产精品正在播放| 丰满少妇在线观看| 亚洲人体偷拍| 黄色录像特级片| 日韩电影免费网址| 久久青青草原| 一区二区三区四区精品视频| 国产精品成人va在线观看| free性m.freesex欧美| 美女av一区二区| 免费超碰在线| 国产亚洲综合久久| 欧美日韩在线中文字幕| 亚洲成人网久久久| 亚洲黄色小说网| 制服丝袜av成人在线看| 波多野结衣家庭主妇| 都市激情亚洲色图| 日韩av女优在线观看| 一区二区三区在线免费视频| 91香蕉视频污在线观看| 国产欧美精品国产国产专区 | 亚洲欧美中日韩| 人人妻人人澡人人爽| 91免费观看视频在线| 中文字幕在线播放一区| 高清不卡在线观看av| 中文字幕无码毛片免费看| 久久99精品久久久| 久久99爱视频| 蜜桃一区二区三区四区| 青青在线视频免费| 久久久久91| 男女午夜激情视频| 亚洲欧美视频一区二区三区| 免费看一级大黄情大片| 一区二区日韩免费看| 野外做受又硬又粗又大视频√| 欧美精选一区| 国产玉足脚交久久欧美| 亚洲精品免费观看| 男人添女人下面高潮视频| 99热精品在线观看| 免费黄色福利视频| 日日骚欧美日韩| 嫩草影院国产精品| 激情五月婷婷综合网| 日韩精品aaa| 国产不卡在线视频| 久久久国产精品无码| 91蜜桃婷婷狠狠久久综合9色| 中文字幕一区二区久久人妻网站 | 国语精品中文字幕| 老汉色老汉首页av亚洲| 国产嫩草一区二区三区在线观看| 欧美美女黄色| 日韩免费av一区二区三区| 日韩精品二区| 国产女人18毛片| 亚洲高清二区| 狠狠热免费视频| 激情文学综合丁香| 无码国产69精品久久久久网站| 99re这里只有精品首页| 欧美精品日韩在线| 亚洲女同一区二区| 日韩污视频在线观看| 在线影视一区二区三区| 97超碰资源站| 亚洲成人精品久久| 国产福利小视频在线| 久久天天躁狠狠躁夜夜躁| gogo高清在线播放免费| 国产成人精品综合| 精品三级久久久| 久久国产精品免费一区| 精品理论电影在线| www.一区二区.com| 久久久天天操| 97免费公开视频| 久久综合丝袜日本网| 免费成人深夜夜行网站| 亚瑟在线精品视频| 激情网站在线观看| 欧美大片国产精品| 成人午夜电影在线观看| 色综合久综合久久综合久鬼88| 小h片在线观看| 91视频8mav| 九九视频精品全部免费播放| 9色视频在线观看| 先锋影音久久久| 99精品视频免费版的特色功能| 久久人人爽人人爽| 久久综合成人网| 欧美日韩国产在线观看| 亚洲人成色777777精品音频| 久久精品国产一区| 是的av在线| 99re在线国产| 色男人天堂综合再现| 日韩av资源在线| 国产 日韩 欧美大片| 制服丨自拍丨欧美丨动漫丨| 姬川优奈aav一区二区| 99精品在线看| 色哟哟入口国产精品| av日韩电影| 国产精品视频免费一区二区三区| 天堂美国久久| 亚欧美在线观看| 久久久99精品久久| 日韩 欧美 综合| 精品国产一区二区三区不卡| 日本免费在线观看| 国产精品久久久久久久久久久久久| 久久超级碰碰| 无码 制服 丝袜 国产 另类| 精品一二线国产| 中文字幕精品亚洲| 欧洲av一区二区嗯嗯嗯啊| 欧美高清成人| 日本久久久久亚洲中字幕| 懂色av一区二区| 日韩免费在线观看av| 国产精品一卡二| 69av视频在线| 欧美一二三区精品| 国产调教视频在线观看| 成人福利在线视频| 性欧美欧美巨大69| 手机免费看av网站| 亚洲色图欧美偷拍| 国产美女裸体无遮挡免费视频| 色青青草原桃花久久综合| 久久福利在线| 亚洲一区二三| 久久精品国产免费看久久精品| 亚洲精品国产精品国自产网站| 色悠久久久久综合欧美99| 欧洲一区av| 国产精品美女av| 91日韩在线| 精品国产乱码久久久久久1区二区| 最新高清无码专区| 国产富婆一级全黄大片| 欧美高清无遮挡| 美女扒开腿让男人桶爽久久动漫| 高清在线观看免费| 久久精品视频在线免费观看| 中文字幕二区三区| 日韩中文娱乐网| 久久国产精品美女| 国产欧美日韩小视频| 久久久久国产精品人| 中文字幕一区二区三区波野结| xvideos成人免费中文版| 欧美经典一区| 欧美 日本 亚洲| 国产日韩欧美精品一区| 一级特黄aaa大片在线观看| 两个人的视频www国产精品| 中文字幕一区二区三区日韩精品 | 国语对白一区二区| 国产婷婷97碰碰久久人人蜜臀| 国产电影一区二区三区爱妃记| 亚洲一区二区三区乱码| 国产69精品久久久久777| 91国产丝袜播放在线| 最近2019好看的中文字幕免费| 9999精品视频| 日本www在线播放| 国产精品无人区| 男人天堂网在线视频| 国产精品成人aaaaa网站| 欧美日韩国产亚洲一区| 老牛影视av老牛影视av| 9191成人精品久久| 91资源在线观看| 亚洲v日韩v欧美v综合| 国产福利一区二区三区在线视频| 久久国产视频一区| 大胆欧美人体视频| 伊人久久大香线蕉| 国产在线观看免费播放| 91国偷自产一区二区三区成为亚洲经典 | 亚洲三级久久久| 外国精品视频在线观看| 国产精品免费在线免费| 亚洲黄色在线| 日本成人精品视频| 日韩成人免费视频| 九九99久久精品在免费线bt| 人妻内射一区二区在线视频| 一区二区三区在线视频免费观看| 九色网友自拍视频手机在线| 99精彩视频在线观看免费| 免费精品视频在线|