時間:2024-02-28 13:28作者:下載吧人氣:24
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ù)集。
下面是一個索引的簡單例子,該索引存儲的記錄為整型并只有一個字段:
該索引最頂層的頁是元數(shù)據(jù)頁,該數(shù)據(jù)頁存儲索引root頁的相關(guān)信息。內(nèi)部節(jié)點(diǎn)位于root下面,葉子頁位于最下面一層。向下的箭頭表示由葉子節(jié)點(diǎn)指向表記錄(TIDs)。
例如通過”indexed-field = expression”形式的條件查詢49這個值。
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的示意圖:
大于和小于可以通過同樣的方法進(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的查詢示意圖:
下面是一個查詢計(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;
網(wǎng)友評論