下載吧 - 綠色安全的游戲和軟件下載中心

          軟件下載吧

          當(dāng)前位置:軟件下載吧 > 技術(shù)開發(fā) > 數(shù)據(jù)庫 > PostgreSQL的B-tree索引用法詳解

          PostgreSQL的B-tree索引用法詳解

          時間:2024-02-28 13:28作者:下載吧人氣:38

          結(jié)構(gòu)

          B-tree索引適合用于存儲排序的數(shù)據(jù)。對于這種數(shù)據(jù)類型需要定義大于、大于等于、小于、小于等于操作符。

          通常情況下,B-tree的索引記錄存儲在數(shù)據(jù)頁中。葉子頁中的記錄包含索引數(shù)據(jù)(keys)以及指向heap tuple記錄(即表的行記錄TIDs)的指針。內(nèi)部頁中的記錄包含指向索引子頁的指針和子頁中最小值。

          B-tree有幾點重要的特性:

          1、B-tree是平衡樹,即每個葉子頁到root頁中間有相同個數(shù)的內(nèi)部頁。因此查詢?nèi)魏我粋€值的時間是相同的。

          2、B-tree中一個節(jié)點有多個分支,即每頁(通常8KB)具有許多TIDs。因此B-tree的高度比較低,通常4到5層就可以存儲大量行記錄。

          3、索引中的數(shù)據(jù)以非遞減的順序存儲(頁之間以及頁內(nèi)都是這種順序),同級的數(shù)據(jù)頁由雙向鏈表連接。因此不需要每次都返回root,通過遍歷鏈表就可以獲取一個有序的數(shù)據(jù)集。

          下面是一個索引的簡單例子,該索引存儲的記錄為整型并只有一個字段:

          PostgreSQL的B-tree索引用法詳解

          該索引最頂層的頁是元數(shù)據(jù)頁,該數(shù)據(jù)頁存儲索引root頁的相關(guān)信息。內(nèi)部節(jié)點位于root下面,葉子頁位于最下面一層。向下的箭頭表示由葉子節(jié)點指向表記錄(TIDs)。

          等值查詢

          例如通過”indexed-field = expression”形式的條件查詢49這個值。

          PostgreSQL的B-tree索引用法詳解

          root節(jié)點有三個記錄:(4,32,64)。從root節(jié)點開始進(jìn)行搜索,由于32≤ 49 < 64,所以選擇32這個值進(jìn)入其子節(jié)點。通過同樣的方法繼續(xù)向下進(jìn)行搜索一直到葉子節(jié)點,最后查詢到49這個值。

          實際上,查詢算法遠(yuǎn)不止看上去的這么簡單。比如,該索引是非唯一索引時,允許存在許多相同值的記錄,并且這些相同的記錄不止存放在一個頁中。此時該如何查詢?我們返回到上面的的例子,定位到第二層節(jié)點(32,43,49)。如果選擇49這個值并向下進(jìn)入其子節(jié)點搜索,就會跳過前一個葉子頁中的49這個值。因此,在內(nèi)部節(jié)點進(jìn)行等值查詢49時,定位到49這個值,然后選擇49的前一個值43,向下進(jìn)入其子節(jié)點進(jìn)行搜索。最后,在底層節(jié)點中從左到右進(jìn)行搜索。

          (另外一個復(fù)雜的地方是,查詢的過程中樹結(jié)構(gòu)可能會改變,比如分裂)

          非等值查詢

          通過”indexed-field ≤ expression” (or “indexed-field ≥ expression”)查詢時,首先通過”indexed-field = expression”形式進(jìn)行等值(如果存在該值)查詢,定位到葉子節(jié)點后,再向左或向右進(jìn)行遍歷檢索。

          下圖是查詢 n ≤ 35的示意圖:

          PostgreSQL的B-tree索引用法詳解

          大于和小于可以通過同樣的方法進(jìn)行查詢。查詢時需要排除等值查詢出的值。

          范圍查詢

          范圍查詢”expression1 ≤ indexed-field ≤ expression2″時,需要通過 “expression1 ≤ indexed-field =expression2″找到一匹配值,然后在葉子節(jié)點從左到右進(jìn)行檢索,一直到不滿足”indexed-field ≤ expression2” 的條件為止;或者反過來,首先通過第二個表達(dá)式進(jìn)行檢索,在葉子節(jié)點定位到該值后,再從右向左進(jìn)行檢索,一直到不滿足第一個表達(dá)式的條件為止。

          下圖是23 ≤ n ≤ 64的查詢示意圖:

          PostgreSQL的B-tree索引用法詳解

          案例

          下面是一個查詢計劃的實例。通過demo database中的aircraft表進(jìn)行介紹。該表有9行數(shù)據(jù),由于整個表只有一個數(shù)據(jù)頁,所以執(zhí)行計劃不會使用索引。為了解釋說明問題,我們使用整個表進(jìn)行說明。

          demo=# select * from aircrafts;
          aircraft_code | model | range
          —————+———————+——-
          773 | Boeing 777-300 | 11100
          763 | Boeing 767-300 | 7900
          SU9 | Sukhoi SuperJet-100 | 3000
          320 | Airbus A320-200 | 5700
          321 | Airbus A321-200 | 5600
          319 | Airbus A319-100 | 6700
          733 | Boeing 737-300 | 4200
          CN1 | Cessna 208 Caravan | 1200
          CR2 | Bombardier CRJ-200 | 2700
          (9 rows)
          demo=# create index on aircrafts(range);
          demo=# set enable_seqscan = off;

          標(biāo)簽[db:關(guān)鍵字]

          相關(guān)下載

          查看所有評論+

          網(wǎng)友評論

          網(wǎng)友
          您的評論需要經(jīng)過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 国产主播一区二区| 日本强伦姧人妻一区二区| 国产一区二区不卡老阿姨| 一区在线免费观看| 亚洲一区二区三区日本久久九| 日韩一区二区免费视频| 无码乱人伦一区二区亚洲一 | 熟女大屁股白浆一区二区| 亚洲色无码专区一区| 无码免费一区二区三区免费播放| 亚洲一区二区三区无码影院| 亚洲丰满熟女一区二区哦| 水蜜桃av无码一区二区| 亚洲国产精品乱码一区二区 | 国产AV午夜精品一区二区入口| 美女视频免费看一区二区| 韩国精品一区二区三区无码视频| 日韩精品一区二区三区老鸭窝| 久久精品国产免费一区| 国产午夜精品一区二区三区| 成人区人妻精品一区二区不卡网站| 国产精品一区二区无线| 国产一区中文字幕| 国产成人高清亚洲一区91| 国产一区二区三区不卡在线观看| 成人精品一区二区激情| 精品国产一区二区三区香蕉事| 国精产品一区一区三区MBA下载| 亚洲AV无码一区二区三区久久精品 | 国产福利精品一区二区| 国产精品视频第一区二区三区 | 国产SUV精品一区二区88| 无码播放一区二区三区| 成人一区二区三区视频在线观看| 女同一区二区在线观看| 亚洲国产专区一区| 在线观看国产一区| 亚洲国产成人久久综合一区| 在线精品视频一区二区| 精品一区二区三区在线观看l| 国产精品视频一区|