日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

earcharts tree 节点间隔_InnoDB是顺序查找B-Tree叶子节点的吗?

發(fā)布時(shí)間:2025/3/20 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 earcharts tree 节点间隔_InnoDB是顺序查找B-Tree叶子节点的吗? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

導(dǎo)讀

在《為什么MySQL能夠支撐千萬數(shù)據(jù)規(guī)模的快速查詢?》中,我詳細(xì)講解了InnoDB B-Tree的結(jié)構(gòu),同時(shí),我以下面這條SQL舉例:

SELECT * FROM user WHERE age >= 15

講解了該查詢是如何搜索輔助索引index_age_birth這顆索引樹的。其中,我在查找葉子節(jié)點(diǎn)時(shí),說到從節(jié)點(diǎn)內(nèi)第一條記錄開始,向右遍歷該節(jié)點(diǎn)內(nèi)所有記錄即可定位到滿足條件的第一條記錄,然后,遍歷該記錄后繼所有記錄,即可得到滿足條件的所有記錄。

但是,如果葉子節(jié)點(diǎn)內(nèi)的記錄太多,而滿足條件的第一條記錄又不在頭部位置,那么,順序遍歷查找的性能是很差的。該如何解決這個(gè)問題呢?我想,你可能已經(jīng)猜到了,是的,由于葉子節(jié)點(diǎn)的記錄是升序排列的,我們完全可以用二分查找,快速定位到滿足條件的第一條記錄。

那么,InnoDB具體是怎么做的呢?

我以用戶表索引index_age_birth為例,先來看一下該索引葉子節(jié)點(diǎn)的結(jié)構(gòu):

見上圖,跟之前我講的輔助索引B-Tree的葉子節(jié)點(diǎn)是不是不一樣?是的,之前我講的比較粗,現(xiàn)在我把它細(xì)化了,為了詳細(xì)講解一個(gè)查詢是如何在B-Tree的葉子節(jié)點(diǎn)中定位一條記錄的。

我們來仔細(xì)看下上面這張圖,相比之前的葉子節(jié)點(diǎn),這張圖多出來三個(gè)元素:

  • infimum:葉子節(jié)點(diǎn)中的虛擬記錄,該記錄的下一條記錄即為葉子節(jié)點(diǎn)中的最小記錄。比如:圖中<15, 2007-06-06, 6>為頁4這個(gè)葉子節(jié)點(diǎn)中的最小記錄。
  • supremum:葉子節(jié)點(diǎn)中的虛擬記錄,該記錄的上一條記錄為葉子節(jié)點(diǎn)中的最大記錄。比如:圖中<18, 2007-06-10, 12>為頁4這個(gè)葉子節(jié)點(diǎn)中的最大記錄。
  • 槽:InnoDB將葉子節(jié)點(diǎn)內(nèi)的記錄分成幾組,每一組由一個(gè)叫做slot,也就是槽指向分組內(nèi)最大的一條記錄。這個(gè)槽有以下幾個(gè)特點(diǎn):
  • (1) 槽內(nèi)存儲(chǔ)的是一個(gè)偏移量,這個(gè)偏移量是從葉子節(jié)點(diǎn)0字節(jié)開始計(jì)算的。比如:

    ? a. 圖中的99,表示從葉子節(jié)點(diǎn)0字節(jié)開始第115字節(jié)的位置為槽0。

    ? b. 圖中的252,表示從葉子節(jié)點(diǎn)0字節(jié)開始第99字節(jié)的位置為槽1。

    ? c. 圖中的112,表示從葉子節(jié)點(diǎn)0字節(jié)開始第220字節(jié)的位置為槽2。

    為啥需要偏移量?為了根據(jù)偏移量定位該偏移量位置所在的記錄。

    (2) 一個(gè)槽指向一個(gè)分組中的最大記錄。比如,圖中,橘色框代表分組,所以,槽1指向第二個(gè)分組的最大記錄<17, 2007-06-10, 11>。

    (3) 槽與槽之間組成一個(gè)無序數(shù)組,但槽的下標(biāo)是有序的。比如,圖中,99、252、112這3個(gè)偏移量是無序的,但是,槽的下標(biāo)0、1、2是有序的。

    這時(shí),你可能會(huì)有個(gè)疑問:為什么第一個(gè)分組只有1條記錄,第二個(gè)分組有4條記錄,而最后一個(gè)分組有2條記錄?

    因?yàn)镮nnoDB引擎規(guī)定:對(duì)于infimum記錄所在的分組只能有 1 條記錄,supremum記錄所在的分組擁有的記錄條數(shù)只能在 1~8 條之間,剩下的分組中記錄的條數(shù)范圍只能在是 4~8 條之間。

    下面,我結(jié)合槽的結(jié)構(gòu)定義,詳細(xì)講解InnoDB在葉子節(jié)點(diǎn)中定位記錄的過程。

    查找過程

    InnoDB查找葉子節(jié)點(diǎn)的過程采用的是對(duì)槽二分查找,槽所指記錄所在分組內(nèi)順序查找的方式。至于為什么槽內(nèi)不用二分查找,是因?yàn)椴壑赶虻挠涗浰诜纸M記錄總數(shù)不會(huì)超過8條,所以,沒必要使用二分查找來提升查找性能。

    我以本章《導(dǎo)讀》中的SQL為例,詳細(xì)講解InnoDB在葉子節(jié)點(diǎn)中如何查找第一條滿足查詢條件的記錄。

    SELECT * FROM user WHERE age >= 15

    見下面5張圖,其中的葉子節(jié)點(diǎn)都是索引index_age_birth這個(gè)B-Tree的,頁4是通過B-Tree搜索定位的葉子節(jié)點(diǎn):

    說明:

  • 定位最小下標(biāo)的槽為low,即圖(1)中的槽0,定位最大下標(biāo)的槽為high,即圖(1)中的槽2。
  • (low + high) / 2進(jìn)行二分查找,即(0 + 2) / 2 = 1,所以,定位槽1,見圖(2),找到槽1指向的記錄<17, 2007-06-10, 11>。
  • 該記錄age = 17,查詢條件age的值為15,17 > 15,說明目標(biāo)記錄在該記錄左邊,所以,見圖(2),high指向槽1,由于low指向槽0,high - low = 1,所以,查找記錄在槽0和槽1之間。
  • 見圖3,將low_rec指向槽0指向的infimum記錄,high_rec指向槽1指向的<17, 2007-06-10, 11>記錄,從槽0指向的記錄,即從infimum記錄開始向右遍歷記錄。ps:圖(3)和(4)為了更清晰地描述槽指向記錄所在的分組內(nèi)部的查找過程,將槽移除了。
  • 遍歷到第二條記錄<15, 2007-06-06, 6>,見圖(4),該記錄age = 15,查詢條件age的值為15,15 = 15,所以,該記錄為滿足查詢條件的第一條記錄,low_rec指向該記錄。
  • 遍歷到第三條記錄<16, 2007-06-08, 8>,見圖(5),該記錄age = 16,查詢條件age的值為15,16 > 15,所以,high_rec指向該記錄。
  • high_rec和low_rec間隔1,說明查找結(jié)束,最終,定位滿足查詢條件age >= 15的第一條記錄為<15, 2007-06-06, 6>。
  • 在這個(gè)查找過程中,你可能有個(gè)疑問,我都已經(jīng)在第5步找到了滿足條件的第一條記錄,為什么還要進(jìn)行第6步?

    因?yàn)檫@個(gè)查找過程是一個(gè)通用算法,假設(shè)我們要查找age = 16的記錄,那么,頁4中包含兩條滿足條件的記錄,結(jié)合上面的查找算法,是不是要執(zhí)行到第6、7步才能找到所有匹配的記錄?!所以,InnoDB采用了該通用查找算法,覆蓋age >= 15和age = 16兩個(gè)場(chǎng)景。

    小結(jié)

    最后,我來總結(jié)一下本章講解的內(nèi)容:

  • 槽的結(jié)構(gòu):將葉子節(jié)點(diǎn)分組,槽指向每組中最大的一條記錄,槽中存儲(chǔ)其指向記錄在葉子節(jié)點(diǎn)內(nèi)的偏移量,該偏移量是相對(duì)葉子節(jié)點(diǎn)0字節(jié)計(jì)算得到的。
  • InnoDB查找索引樹葉子節(jié)點(diǎn)的過程: 對(duì)槽二分查找,槽指向記錄所在的分組內(nèi)順序查找。
  • 思考題

    InnoDB直接對(duì)葉子節(jié)點(diǎn)記錄進(jìn)行二分查找不香嗎?為什么要引入槽的概念查找索引樹葉子節(jié)點(diǎn),即對(duì)槽二分查找,槽指向記錄所在的分組內(nèi)順序查找?

    總結(jié)

    以上是生活随笔為你收集整理的earcharts tree 节点间隔_InnoDB是顺序查找B-Tree叶子节点的吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲人成免费电影 | 中文字幕第6页 | 国产精品乱子伦 | 亚洲午夜天堂 | 亚洲自拍偷拍欧美 | 又黄又色的网站 | 日本黄色大片免费看 | 国产女人爽到高潮a毛片 | 噼里啪啦免费高清看 | 国产91免费视频 | 亚洲天堂一区二区在线观看 | 黄频在线 | 农村少妇无套内谢粗又长 | 日本在线免费观看视频 | 久久精品国产亚洲av高清色欲 | 无码人妻一区二区三区在线视频 | 成人性生活毛片 | 精品欧美一区二区在线观看 | 人人干天天操 | 调教女m荡骚贱淫故事 | 在线观看视频亚洲 | 中日韩一级片 | 国产精品亚洲欧美在线播放 | 久久爱综合 | 国产欧美日韩综合精品一区二区三区 | 综合色网站 | 亚洲成人激情在线 | 欧美女同视频 | 久久中文字幕av | 欧美激情在线狂野欧美精品 | 色戒未删节版 | 亚洲精品国产av | 51久久久| 成人免费视频视频 | 手机av在线免费观看 | 久热中文字幕 | 久操中文 | 日本wwwwwww| 波多野结衣一二三区 | 一区二区三区视频观看 | 在线免费观看日本 | 国产午夜精品一区 | 亚洲精品国产欧美 | 中国黄色一级片 | 男人天堂色 | 人妻饥渴偷公乱中文字幕 | 日韩精品无| 国产亚洲精品久久久久久久久动漫 | 波多野结衣视频一区二区 | 久久国产精品精品国产色婷婷 | www.成人av| 亚洲欧美偷拍视频 | aaa亚洲精品 | 在线成人毛片 | 日韩精品乱码久久久久久 | 免费观看日韩av | 日本一区二区三区在线观看视频 | 91黄版| 欧美偷拍视频 | 精品欧美色视频网站在线观看 | 国产一区二区三区在线视频 | 日韩一级影片 | 亚洲三区在线观看无套内射 | 自拍偷拍亚洲图片 | 麻豆精品视频免费观看 | 99精品国产一区二区 | 摸大乳喷奶水www视频 | 性一级视频 | 日韩一区二区三区在线播放 | 国产精品久久影视 | 91国产在线免费观看 | 91影音 | 亚洲29p| 亚洲自拍偷拍精品视频 | 午夜寂寞影院在线观看 | 九九热视频这里只有精品 | 四虎影视国产精品 | 女生鸡鸡软件 | 亚洲国产视频一区二区 | 久久经典 | 午夜网站在线 | 日本高清一区二区视频 | 狼人伊人av| 一区二区三区精品视频 | 伊人激情在线 | 人妻丰满熟妇无码区免费 | 一色桃子juy758在线播放 | 日韩女优一区二区 | 国产成人无码av在线播放dvd | 爱福利视频一区 | 国产探花在线精品一区二区 | 美脚の诱脚舐め脚 | 有码视频在线观看 | 极品新婚夜少妇真紧 | 国产又粗又硬又黄的视频 | 亚洲综合图色40p | 中文天堂在线播放 | 日韩性猛交ⅹxxx乱大交 | 中文字幕有码无码人妻av蜜桃 |