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

軟件下載吧

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

PostgreSQL的B-tree索引用法詳解

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

結(jié)構(gòu)

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

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

B-tree有幾點(diǎn)重要的特性:

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

2、B-tree中一個節(jié)點(diǎn)有多個分支,即每頁(通常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é)點(diǎn)位于root下面,葉子頁位于最下面一層。向下的箭頭表示由葉子節(jié)點(diǎn)指向表記錄(TIDs)。

等值查詢

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

PostgreSQL的B-tree索引用法詳解

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

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

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

非等值查詢

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

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

PostgreSQL的B-tree索引用法詳解

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

范圍查詢

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

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

PostgreSQL的B-tree索引用法詳解

案例

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

熱門閱覽

最新排行

公眾號

主站蜘蛛池模板: 国产小视频在线观看免费| 日韩欧美国产中文字幕| 欧美激情在线精品video| 日本片免费观看一区二区| 大学生秘书胯下吞吐| 免费va在线观看| 久久亚洲sm情趣捆绑调教| 91精品一区二区| 精品久久中文字幕| 日本三级很黄试看120秒| 国产精品久久国产精品99| 免费一级大片儿| a毛片免费全部在线播放**| 熟妇激情内射com| 很黄很污的视频网站| 国产国语在线播放视频| 亚洲国产另类久久久精品黑人| 免费AV一区二区三区无码| 一个人看的视频在线| 蜜桃精品免费久久久久影院| 日韩在线永久免费播放| 国产精品免费看久久久无码| 亚洲视频国产精品| 三上悠亚日韩精品| 男男同志chinese中年壮汉| 成人免费一区二区三区视频| 动漫人物一起差差差漫画免费漫画| 亚洲欧美日韩在线一区| www.色日本| 精品国产午夜肉伦伦影院| 日本伦理电影网伦理在线电影| 天天干视频网站| 免费黄网站在线看| 99久久无色码中文字幕| 男女性潮高清免费网站| 国内色综合精品视频在线| 你看桌子上都是你流的| 一级毛片一级片| 精品国产人成亚洲区| 在线观看亚洲一区二区| 亚洲中文字幕无码久久综合网|