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

          軟件下載吧

          當前位置:軟件下載吧 > 技術開發 > 數據庫 > PostgreSQL的B-tree索引用法詳解

          PostgreSQL的B-tree索引用法詳解

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

          結構

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

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

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

          1、B-tree是平衡樹,即每個葉子頁到root頁中間有相同個數的內部頁。因此查詢任何一個值的時間是相同的。

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

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

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

          PostgreSQL的B-tree索引用法詳解

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

          等值查詢

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

          PostgreSQL的B-tree索引用法詳解

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

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

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

          非等值查詢

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

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

          PostgreSQL的B-tree索引用法詳解

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

          范圍查詢

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

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

          PostgreSQL的B-tree索引用法詳解

          案例

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

          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;

          標簽[db:關鍵字]

          相關下載

          查看所有評論+

          網友評論

          網友
          您的評論需要經過審核才能顯示

          熱門閱覽

          最新排行

          公眾號

          主站蜘蛛池模板: 日韩高清一区二区三区不卡| 国产一区视频在线免费观看| 高清无码一区二区在线观看吞精| 无码人妻一区二区三区免费视频| 色偷偷久久一区二区三区| 日本人的色道www免费一区| 精品无人区一区二区三区在线| 精品国产香蕉伊思人在线在线亚洲一区二区 | 精品成人一区二区三区四区| 亚洲AV一区二区三区四区| 午夜福利一区二区三区在线观看| 精品国产一区二区三区AV性色| 国产一区二区三区免费在线观看| 亚洲av成人一区二区三区在线播放| 亚洲AV综合色区无码一区爱AV | 亚洲国产成人久久综合一区 | 国产成人av一区二区三区在线观看 | 亚洲中文字幕久久久一区| 人妻夜夜爽天天爽爽一区| 国产精品一区二区久久国产| A国产一区二区免费入口| 久久久国产一区二区三区 | 国产精品视频一区麻豆| 91福利视频一区| 麻豆国产一区二区在线观看 | 精品久久国产一区二区三区香蕉 | 亚洲日本中文字幕一区二区三区| 精品国产福利在线观看一区 | 人妻AV中文字幕一区二区三区 | 在线观看一区二区三区视频| 狠狠综合久久av一区二区| 国产成人综合亚洲一区| 日本中文字幕在线视频一区| 精品一区二区三区四区在线| 亚洲一区爱区精品无码| 在线精品国产一区二区| 久久久国产精品无码一区二区三区 | 日韩a无吗一区二区三区| 日韩精品一区二区三区国语自制| 精品一区精品二区| 国内精品无码一区二区三区|